3

我不知道为什么我得到一个NullPointerException,但它发生在行spinner.setAdapter(arrayAdapter)。任何人都可以看看我的代码,看看问题是什么以及如何解决它。提前致谢。微控制器和ArrayAdapter Android中的NullPointerException

这里是我的代码:

public class SlidingTabsActivity extends SherlockFragmentActivity 
{ 

ViewPager viewPager; 
TabsAdapter tabsAdapter; 
ActionBar actionBarTabs; 
Spinner spinner; 
ArrayAdapter<String> arrayAdapter; 

PopupFirmware popupFirmware; // Popup firmware class instance 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    viewPager = new ViewPager(this); 
    viewPager.setId(R.id.pager); 
    setContentView(viewPager); 

    arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, R.array.device_description); 
    spinner = (Spinner) findViewById(R.id.tabsSpinner); 
    spinner.setAdapter(arrayAdapter); 

    actionBarTabs = getSupportActionBar(); 
    actionBarTabs.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBarTabs.setCustomView(spinner); 
    actionBarTabs.setDisplayShowCustomEnabled(true); 
    actionBarTabs.setDisplayHomeAsUpEnabled(true); 

    tabsAdapter = new TabsAdapter(this, viewPager); // Declares the tabs adapter class with the view pager view 

    popupFirmware = new PopupFirmware(this); // Declaring popup firmware class 

    /* Adds fragments to the tabs adapter */ 
    tabsAdapter.addTab(actionBarTabs.newTab().setText("PV"), Fragment_1.class, null); 
    tabsAdapter.addTab(actionBarTabs.newTab().setText("CONFIG"), Fragment_2.class, null); 
    tabsAdapter.addTab(actionBarTabs.newTab().setText("DIAG"), Fragment_3.class, null); 

} 

这里是logcat的:

11-20 13:16:26.259: E/AndroidRuntime(11789): FATAL EXCEPTION: main 
11-20 13:16:26.259: E/AndroidRuntime(11789): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mobileapplicationretry/com.example.mobileapplicationretry.SlidingTabsActivity}: java.lang.NullPointerException 
11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at android.os.Looper.loop(Looper.java:137) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread.main(ActivityThread.java:5103) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at java.lang.reflect.Method.invokeNative(Native Method) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at java.lang.reflect.Method.invoke(Method.java:525) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at dalvik.system.NativeStart.main(Native Method) 
11-20 13:16:26.259: E/AndroidRuntime(11789): Caused by: java.lang.NullPointerException 
11-20 13:16:26.259: E/AndroidRuntime(11789): at com.example.mobileapplicationretry.SlidingTabsActivity.onCreate(SlidingTabsActivity.java:51) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.Activity.performCreate(Activity.java:5133) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
11-20 13:16:26.259: E/AndroidRuntime(11789): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
11-20 13:16:26.259: E/AndroidRuntime(11789): ... 11 more 
+0

尝试getResources()。getStringArray(R.array.device_description)intead只适配器中的R.array.device_description。 –

+0

我不明白你为什么期望在ViewPager中找到一个带有id tabsSpinner的微调器 – Blackbelt

回答

6

您的微调框为空。
发现,先创建ViewPager,使setContentView

setContentView(viewPager); 

但你ViewPager是空的,因为你还没有把任何东西给它。而接下来你拨打:

spinner = (Spinner) findViewById(R.id.tabsSpinner); 

这意味着findViewById会寻找你的微调开始的根视图您Activity - ViewPager您已经创建较早,里面是空的。所以Spinner永远不会被发现 - 并且它始终为空。

+0

我明白你的意思了。我想添加一个微调器到我的操作栏,并且我正在使用一个带有3个片段的活动作为滑动标签。如何将微调器添加到操作栏? –

+0

这将是另一个问题:)其实网上有很多例子和SO。 – Viacheslav

+0

我已经问过这个问题:http://stackoverflow.com/questions/20094971/is-it-possible-to-use-sliding-tabs-and-a-spinner-in-the-action-bar-in - 请帮助,如果你可以 –

0

你有没有尝试过这样的:

ArrayAdapter arrayAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, R.array.device_description); 

ArrayAdapter arrayAdapter = new ArrayAdapter<String>(Activity.this, android.R.layout.simple_spinner_item, R.array.device_description); 

您的内容似乎为空

1

要在ActionBar添加Spinner来控制你的Viewpager,你可以做这样的:

public class MainActivity extends FragmentActivity implements ActionBar.OnNavigationListener { 

ActionBar actionBar; 
ViewPager mViewPager; 
ArrayAdapter<String> mSpinnerAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_viewpager); // your layout Viewpager 
... 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
... 
    mSpinnerAdapter = ArrayAdapter<String>(actionBar.getThemedContext(), android.R.layout.simple_spinner_item, R.array.device_description); 
    actionBar.setListNavigationCallbacks(mSpinnerAdapter, this); 
} 

@Override 
public boolean onNavigationItemSelected(int position, long id) { 
    mViewPager.setCurrentItem(position); 
    return false; 
} 

} 

如果您想自定义您的微调,可以使两个自定义TextView的,就像如下:

相反的:

ArrayAdapter<String> mSpinnerAdapter; 
mSpinnerAdapter = ArrayAdapter<String>(actionBar.getThemedContext(), android.R.layout.simple_spinner_item, R.array.device_description); 

更改为:

ArrayAdapter<CharSequence> mSpinnerAdapter; 
// your custom TextView selected and your Spinner Array: 
mSpinnerAdapter = ArrayAdapter.createFromResource(actionBar.getThemedContext(), R.array.device_description, R.layout.spinner_selected_item); 
// your custom TextView normal: 
mSpinnerAdapter.setDropDownViewResource(R.layout.spinner_item); 

编辑:

如果你想同时导航,我想你一定要做一个Custom TabbarTextView。也许你可以尝试这样的事情(和保持微调导航):

<!-- Tab Nav --> 

<TableLayout 
    android:id="@+id/tabnavmain" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:padding="0dip" 
    android:stretchColumns="1" > 

    <TableRow 
     android:id="@+id/tabrowmain" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:weightSum="3" > 

     <TextView 
      android:id="@+id/tabmain1" 
       android:layout_width="0dip" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:onClick="onNavSelected" 
       android:clickable="true" /> 

     <TextView 
      android:id="@+id/tabmain2" 
       android:layout_width="0dip" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:onClick="onNavSelected" 
       android:clickable="true" /> 

     <TextView 
      android:id="@+id/tabmain3" 
       android:layout_width="0dip" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:onClick="onNavSelected" 
       android:clickable="true" /> 

    </TableRow> 

</TableLayout> 

<!-- End Tab Nav --> 

而在你的Activity,你可以做一个NavListener

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
    // ... 
    NavListener navListener = new NavListener(); 
} 

private class NavListener implements View.OnClickListener { 
    @Override 
    public void onNavSelected(View v) { 
     switch (v.getId()) { 
      case R.id.tabmain1: 
       // do something like setCurrentItem(position) to your Viewpager 
      break; 
      case R.id.tabmain2: 
       // do something else... 
      break; 
      case R.id.tabmain3: 
       // do something... 
      break; 
     } 
    } 
}; 

你必须选择,如果你想Tabs OR Spinner导航。我认为你们不能在一起。
希望得到这个帮助。

+0

我知道你不能有两个。但我只想要在操作栏中显示一个微调控件的自定义视图,并且只有标签可以导航。微调只会更新片段中的视图。你知道你如何做到这一点? –

+0

是的,你必须强制模式列表导航,这一行:'setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);'。 – Fllo

+0

我已经完成了,它带走了标签。我希望能够保留标签并在操作栏中有一个微调器。这可能吗? –