Java 带有ViewPager和ActionBar锁定选项卡的滑动菜单

Java 带有ViewPager和ActionBar锁定选项卡的滑动菜单,java,android,actionbarsherlock,android-viewpager,slidingdrawer,Java,Android,Actionbarsherlock,Android Viewpager,Slidingdrawer,在我的日历应用程序中,我使用ActionBarSherlock显示两个选项卡-1)日历2)转换器。在ActionBar菜单项的click事件上,我使用抽屉显示当月的事件摘要 我想专门为“日历”选项卡使用viewpager,我是这样实现的: Main.java: public class BaseActivity extends SlidingSherlockFragmentActivity { private ViewPager pager; CalendarFragment

在我的日历应用程序中,我使用ActionBarSherlock显示两个选项卡-1)日历2)转换器。在ActionBar菜单项的click事件上,我使用抽屉显示当月的事件摘要

我想专门为“日历”选项卡使用viewpager,我是这样实现的:

Main.java:

public class BaseActivity extends SlidingSherlockFragmentActivity 
{

    private ViewPager pager;
    CalendarFragmentPagerAdapter mPagerAdapter;
    private static final int MONTHS_LIMIT = 5;

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

        setTitle(R.string.app_name);

        setContentView(R.layout.main);
        getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.main, new CalendarFragment())
        .commit();

        setBehindContentView(R.layout.content_frame);
        getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.content_frame, new EventsSummary())
        .commit();

        setSlidingActionBarEnabled(false);

        final ActionBar bar = getSupportActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        bar.setHomeButtonEnabled(true);

        ActionBar.Tab calendar = bar.newTab();
        ActionBar.Tab converter = bar.newTab();

        calendar.setText(this.getResources().getString(R.string.calendar));
        converter.setText(this.getResources().getString(R.string.converter));

        calendar.setTabListener(new MyTabListener());
        converter.setTabListener(new MyTabListener());

        bar.addTab(calendar);
        bar.addTab(converter);

        // customize the SlidingMenu
        SlidingMenu sm = getSlidingMenu();
        sm.setShadowWidthRes(R.dimen.shadow_width);
        sm.setShadowDrawable(R.drawable.shadow);
        sm.setBehindOffsetRes(R.dimen.actionbar_home_width);
        sm.setSlidingEnabled(false);

        mPagerAdapter = new CalendarFragmentPagerAdapter(getSupportFragmentManager());
        pager = (ViewPager) this.findViewById(R.id.viewpager);
        pager.setAdapter(mPagerAdapter);
        pager.setCurrentItem(MONTHS_LIMIT / 2);


    }


    private class MyTabListener implements ActionBar.TabListener
    {

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            if(tab.getPosition()==0)
            {
                CalendarFragment frag = new CalendarFragment();
                ft.replace(R.id.main, frag);
            }
            else
            {
                ConverterFragment frag = new ConverterFragment();
                ft.replace(R.id.main, frag);
            }
        }
        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
        }
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
        }
     }

    public boolean onOptionsItemSelected(MenuItem item) {
        Intent newActivity;
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.menu_slidingmenu:
                toggle();
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }



    public class CalendarFragmentPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int position) {
            CalendarFragment fragment = new CalendarFragment();
            Bundle args = new Bundle();
            args.putInt("offset", position - MONTHS_LIMIT / 2);
            fragment.setArguments(args);
            return fragment;
        }

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

    }
}
public class CalendarFragment extends Fragment
{

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

            Bundle args = getArguments();
            int offset = args.getInt("offset"); //throws NullPointerException
        }

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

            View v =  inflater.inflate(R.layout.simple_calendar_view, container, false);

            .....

            return v;
        }

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putBoolean("dummy", true);
        }


}
CalendarFragment.java:

public class BaseActivity extends SlidingSherlockFragmentActivity 
{

    private ViewPager pager;
    CalendarFragmentPagerAdapter mPagerAdapter;
    private static final int MONTHS_LIMIT = 5;

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

        setTitle(R.string.app_name);

        setContentView(R.layout.main);
        getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.main, new CalendarFragment())
        .commit();

        setBehindContentView(R.layout.content_frame);
        getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.content_frame, new EventsSummary())
        .commit();

        setSlidingActionBarEnabled(false);

        final ActionBar bar = getSupportActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        bar.setHomeButtonEnabled(true);

        ActionBar.Tab calendar = bar.newTab();
        ActionBar.Tab converter = bar.newTab();

        calendar.setText(this.getResources().getString(R.string.calendar));
        converter.setText(this.getResources().getString(R.string.converter));

        calendar.setTabListener(new MyTabListener());
        converter.setTabListener(new MyTabListener());

        bar.addTab(calendar);
        bar.addTab(converter);

        // customize the SlidingMenu
        SlidingMenu sm = getSlidingMenu();
        sm.setShadowWidthRes(R.dimen.shadow_width);
        sm.setShadowDrawable(R.drawable.shadow);
        sm.setBehindOffsetRes(R.dimen.actionbar_home_width);
        sm.setSlidingEnabled(false);

        mPagerAdapter = new CalendarFragmentPagerAdapter(getSupportFragmentManager());
        pager = (ViewPager) this.findViewById(R.id.viewpager);
        pager.setAdapter(mPagerAdapter);
        pager.setCurrentItem(MONTHS_LIMIT / 2);


    }


    private class MyTabListener implements ActionBar.TabListener
    {

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            if(tab.getPosition()==0)
            {
                CalendarFragment frag = new CalendarFragment();
                ft.replace(R.id.main, frag);
            }
            else
            {
                ConverterFragment frag = new ConverterFragment();
                ft.replace(R.id.main, frag);
            }
        }
        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
        }
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
        }
     }

    public boolean onOptionsItemSelected(MenuItem item) {
        Intent newActivity;
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.menu_slidingmenu:
                toggle();
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }



    public class CalendarFragmentPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int position) {
            CalendarFragment fragment = new CalendarFragment();
            Bundle args = new Bundle();
            args.putInt("offset", position - MONTHS_LIMIT / 2);
            fragment.setArguments(args);
            return fragment;
        }

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

    }
}
public class CalendarFragment extends Fragment
{

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

            Bundle args = getArguments();
            int offset = args.getInt("offset"); //throws NullPointerException
        }

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

            View v =  inflater.inflate(R.layout.simple_calendar_view, container, false);

            .....

            return v;
        }

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putBoolean("dummy", true);
        }


}
问题出现在CalendarFragment中的这一行:

int offset = args.getInt("offset");
它抛出错误
NullPointerException
,调试表明这是因为
Bundle args=getArguments()
为null

我试图将断点放在PagerAdapter中的这一行:

Bundle args = new Bundle();
但它从未到达这里,应用程序崩溃,抛出
NullPointerException

我哪里出错了?

这里

getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.main, new CalendarFragment())
        .commit();
这里呢

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    if (tab.getPosition() == 0) {
        CalendarFragment frag = new CalendarFragment();
        ft.replace(R.id.main, frag);
    } else {
        ConverterFragment frag = new ConverterFragment();
        ft.replace(R.id.main, frag);
    }
}
您只是创建了一个没有任何参数的空CalendarFragment实例


因此,您的活动将启动,创建一个没有参数的空片段,然后在尝试获取这些片段时崩溃

,感谢您的指出。否则,我如何确保FragmentPagerAdapter将参数传递给CalendarFragment而不会再次替换它?