mainActivity中的空指针错误,用于在Android工作室上使用选项卡构建滑动视图

时间:2015-04-04 21:34:07

标签: android android-fragments android-actionbar android-viewpager swipeview

我希望在我的应用程序中使用tabs功能构建滑动视图,方法是按照我在论坛中的一个答案中找到的教程

[http://www.androidhive.info/2013/10/android-tab-layout-with-swipeable-views-1/]

但我一直得到一个空指针错误,我似乎无法找出原因?我严格遵循了教程,并在论坛上阅读了有关滑动视图的其他类似问题。编码几乎与我目前的编码相同。但每次我运行模拟器时都会出现此错误

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tim.swipe/com.example.tim.swipe.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActionBar$Tab android.app.ActionBar.newTab()' on a null object reference

我认为它与ActionBar有关,但教程和其他来源的代码实际上是相同的。

MainActivity.java

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {



ViewPager viewPager;
TabsPagerAdapter adapter;
ActionBar actionBar;
String[] tabs =  { "FragmentA", "FragmentB", "FragmentC" };

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    adapter = new TabsPagerAdapter(getSupportFragmentManager());

    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }
}




@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

}

activity_main.xml中

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">

TabsPageAdapter.java

public class TabsPagerAdapter extends FragmentPagerAdapter {
public TabsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int i) {

    switch (i) {
        case 0:
            // Top Rated fragment activity
            return new FragmentA();
        case 1:
            // Games fragment activity
            return new FragmentB();
        case 2:
            // Movies fragment activity
            return new FragmentC();
    }
    return null;
}

@Override
public int getCount() {
    return 3;
}

FragmentA

public class FragmentA extends Fragment {


public FragmentA() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_a, container, false);

    return rootView;
}

FragmentB和FragmentC除了布局外都有相同的代码。

2 个答案:

答案 0 :(得分:0)

将此变量添加到Class:

private TabsPagerAdapter mAdapter;

将onCreate方法更改为:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(mAdapter);
    actionBar.setNavigationMode(actionBar.NAVIGATION_MODE_TABS);

    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }
}

答案 1 :(得分:0)

我也遇到了这个错误。 这是一个适合我的解决方案。

添加

getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

<强>之前

setContentView

确保Manifest中的主题支持Action Bar。

同时确保您的Android minsdkversion高于11。

希望这对你有用。

您可以参考下面的原始答案 Reference