简体   繁体   中英

ANDROID: getActionBar() produces a null pointer exception with a tab / fragment activity

Basically I'm making a tab activity that has fragments of other activities as the tabs. However when it runs, I am recieving a null pointer exception at the line:

        final ActionBar actionBar = getActionBar();

Here is the whole activity. It is taken from the google sample.

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

SectionsPagerAdapter mSectionsPagerAdapter;

ViewPager mViewPager;

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

    // Set up the action bar. The navigation mode is set to NAVIGATION_MODE_TABS, which will
    // cause the ActionBar to render a set of tabs. Note that these tabs are *not* rendered
    // by the ViewPager; additional logic is lower in this file to synchronize the ViewPager
    // state with the tab state. (See mViewPager.setOnPageChangeListener() and onTabSelected().)
    // BEGIN_INCLUDE (set_navigation_mode)
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    // END_INCLUDE (set_navigation_mode)

    // BEGIN_INCLUDE (setup_view_pager)
    // Create the adapter that will return a fragment for each of the three primary sections
    // of the app.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    // END_INCLUDE (setup_view_pager)

    // When swiping between different sections, select the corresponding tab. We can also use
    // ActionBar.Tab#select() to do this if we have a reference to the Tab.
    // BEGIN_INCLUDE (page_change_listener)
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }
    });
    // END_INCLUDE (page_change_listener)

    // BEGIN_INCLUDE (add_tabs)
    // For each of the sections in the app, add a tab to the action bar.
    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        // Create a tab with text corresponding to the page title defined by the adapter. Also
        // specify this Activity object, which implements the TabListener interface, as the
        // callback (listener) for when this tab is selected.
        actionBar.addTab(
                actionBar.newTab()
                        .setText(mSectionsPagerAdapter.getPageTitle(i))
                        .setTabListener(this));
    }
    // END_INCLUDE (add_tabs)
}

/**
 * Update {@link ViewPager} after a tab has been selected in the ActionBar.
 *
 * @param tab                 Tab that was selected.
 * @param fragmentTransaction A {@link android.app.FragmentTransaction} for queuing fragment operations to
 *                            execute once this method returns. This FragmentTransaction does
 *                            not support being added to the back stack.
 */
// BEGIN_INCLUDE (on_tab_selected)
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    // When the given tab is selected, tell the ViewPager to switch to the corresponding page.
    mViewPager.setCurrentItem(tab.getPosition());
}
// END_INCLUDE (on_tab_selected)

/**
 * Unused. Required for {@link android.app.ActionBar.TabListener}.
 */
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

/**
 * Unused. Required for {@link android.app.ActionBar.TabListener}.
 */
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

// BEGIN_INCLUDE (fragment_pager_adapter)

/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages. This provides the data for the {@link ViewPager}.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {
    // END_INCLUDE (fragment_pager_adapter)

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    // BEGIN_INCLUDE (fragment_pager_adapter_getitem)

    /**
     * Get fragment corresponding to a specific position. This will be used to populate the
     * contents of the {@link ViewPager}.
     *
     * @param position Position to fetch fragment for.
     * @return Fragment for specified position.
     */
    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a DummySectionFragment (defined as a static inner class
        // below) with the page number as its lone argument.
        switch (position) {

            case 0:
                return new SearchPlayerFragment();
            case 1:
                return new SearchPlayerFragment();
            case 2:
                return new SearchPlayerFragment();
            default:
                return new SearchPlayerFragment();
        }
    }
    // END_INCLUDE (fragment_pager_adapter_getitem)

    // BEGIN_INCLUDE (fragment_pager_adapter_getcount)

    /**
     * Get number of pages the {@link ViewPager} should render.
     *
     * @return Number of fragments to be rendered as pages.
     */
    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }
    // END_INCLUDE (fragment_pager_adapter_getcount)

    // BEGIN_INCLUDE (fragment_pager_adapter_getpagetitle)

    /**
     * Get title for each of the pages. This will be displayed on each of the tabs.
     *
     * @param position Page to fetch title for.
     * @return Title for specified page.
     */
    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            case 2:
                return getString(R.string.title_section3).toUpperCase(l);
        }
        return null;
    }
    // END_INCLUDE (fragment_pager_adapter_getpagetitle)
}

}

getActionBar() returns null because you are extending FragmentActivity .

Extend AppCompactActivity instead.

Try calling the Support Action Bar instead

getSupportActionBar();

I suggest you inherit from an ActionBarActivity instead of a FragmentActivity

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM