在使用Sherlock Library在ActionBar中添加导航列表时,Tabs隐藏在Android中?

时间:2013-03-29 07:43:51

标签: android tabs actionbarsherlock

我正在使用Sherlock库使用ActionBar。在此应用程序中也实现了选项卡。

现在,当我在ActionBar中使用NavigationList时,我丢失了Tab片段。为了在ActionBar中使用ListNavigation,我使用了:

mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

&安培;在此之前,我使用mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);作为标签,但没有列表。

现在,我想同时使用NavigationListTab Fragments

public class MainActivity extends SherlockFragmentActivity implements OnNavigationListener {
    ActionBar mActionBar;
    ViewPager mPager;

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

        /** Getting a reference to action bar of this activity */
        mActionBar = getSupportActionBar();

        /** Set tab navigation mode */
        mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        //mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(
                this, 
                R.array.locations, 
                android.R.layout.simple_spinner_item);

        mActionBar.setListNavigationCallbacks(mSpinnerAdapter, this);
        mActionBar.setIcon(R.drawable.app_icon);

        /** Getting a reference to ViewPager from the layout */
        mPager = (ViewPager) findViewById(R.id.pager);

        /** Getting a reference to FragmentManager */
        FragmentManager fm = getSupportFragmentManager();      

        /** Defining a listener for pageChange */
        ViewPager.SimpleOnPageChangeListener pageChangeListener = new ViewPager.SimpleOnPageChangeListener(){
            @Override
            public void onPageSelected(int position) {              
                super.onPageSelected(position);
                mActionBar.setSelectedNavigationItem(position);             
            }

        };

        /** Setting the pageChange listner to the viewPager */
        mPager.setOnPageChangeListener(pageChangeListener);

        /** Creating an instance of FragmentPagerAdapter */
        MyFragmentPagerAdapter fragmentPagerAdapter = new MyFragmentPagerAdapter(fm);

        /** Setting the FragmentPagerAdapter object to the viewPager object */
        mPager.setAdapter(fragmentPagerAdapter);

        mActionBar.setDisplayShowTitleEnabled(true);

        /** Defining tab listener */
        ActionBar.TabListener tabListener = new ActionBar.TabListener() {

            @Override
            public void onTabUnselected(Tab tab, FragmentTransaction ft) {              
            }

            @Override
            public void onTabSelected(Tab tab, FragmentTransaction ft) {
                mPager.setCurrentItem(tab.getPosition());

            }

            @Override
            public void onTabReselected(Tab tab, FragmentTransaction ft) {
            }
        };

        /** Creating Android Tab */
        Tab tab = mActionBar.newTab()
                .setText("Android")
                .setIcon(R.drawable.android)
                .setTabListener(tabListener);

        mActionBar.addTab(tab);

        /** Creating Apple Tab */
        tab = mActionBar.newTab()
                .setText("Apple")
                .setIcon(R.drawable.apple)
                .setTabListener(tabListener); 
        mActionBar.addTab(tab);  


    }
}

MyFragmentPagerAdapter.java

public class MyFragmentPagerAdapter extends FragmentPagerAdapter{

    final int PAGE_COUNT = 2;

    /** Constructor of the class */
    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);

    }

    /** This method will be invoked when a page is requested to create */
    @Override
    public Fragment getItem(int arg0) {
        Bundle data = new Bundle();
        switch(arg0){

            /** Android tab is selected */
            case 0:
                AndroidFragment androidFragment = new AndroidFragment();                
                data.putInt("current_page", arg0+1);
                androidFragment.setArguments(data);
                return androidFragment;

            /** Apple tab is selected */
            case 1:
                AppleFragment appleFragment = new AppleFragment();
                data.putInt("current_page", arg0+1);
                appleFragment.setArguments(data);
                return appleFragment;   
        }

        return null;
    }

    /** Returns the number of pages */
    @Override
    public int getCount() {     
        return PAGE_COUNT;
    }

}

另外两个班级: 1)public class AppleFragment extends SherlockListFragment

2)public class AndroidFragment extends SherlockListFragment

请建议我,为什么我在将List添加到ActionBar时失去了我的标签。

2 个答案:

答案 0 :(得分:1)

您不能同时使用NAVIGATION_MODE_LISTNAVIGATION_MODE_TABS。您一次只能使用导航模式。

答案 1 :(得分:1)

ActionBar中列表导航和标签的使用是互斥的,您只能使用一个。

如果要同时使用列表和选项卡,则必须对其中至少一个使用不同的实现。对于标签,您可以使用ViewPagerIndicatorActionBar中的微调器可以通过多种方式创建:

  • 使用自定义视图创建微调器
  • 使用actionLayoutactionViewClass作为菜单项
  • 使用ActionProvider作为菜单项

编辑:
在您的情况下,最简单的调整是使用ViewPagerIndicator而不是ActionBar标签。更改列表导航需要更多工作。
ViewPagerIndicator项目的网页显示了一些您应该查看的示例设置。该项目的GitHub page有许多示例,展示了如何使用库的各种设置。我想你要找的是TabPageIndicator,所以请看this sample(注意标签的标题是在FragmentPagerAdapter中创建的,你不需要ActionBar.Tab }和ActionBar.TabListener了。)