最近在一个小项目里遇见一个问题,就是用TabWidget加上ViewPager做出一个可以滑动的Tab效果。效果在Android2.3上显示效果还是可以的,但是在4.0系统上就会使 TabWeight变成holo风格。如果在Tabweight里面添加了文字和图标。在4.0系统中默认只显示文字(文字为空时显示图标)。
同一个应用,两种显示效果,对我来说是接受不了的。
然后在网上搜了一圈
找到一个解决办法:http://stackoverflow.com/questions/10745092/icon-in-tab-is-not-showing-up
但是我觉得这样自定义TabWeight会把一个简单的问题越搞越复杂
初衷只是做一个可以滑动的TAB界面,这样用tabhost,ViewPager,还要自定义TabWeight,感觉结构就太繁琐了。不如把问题简单化。
把风格确定为holo风格,为了兼容4.0之前的版本,使用ActionBarSherlock包
ActionBarSherlock可以去网站下 http://actionbarsherlock.com/download.html
也可以去GIT上找 https://github.com/JakeWharton/ActionBarSherlock
使用ActionBarSherlock里的tab,holo风格比较简洁,索性也就不加icon图标什么的了。
就不贴自己的代码了,网上找了个例子,把关键代码贴一下,有兴趣的还是去原帖看看吧,很详细。
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; } }
主MainActivity的代码,然后里面的FragmentActivity就随便加两个就行了
public class MainActivity extends SherlockFragmentActivity { 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_TABS); /** 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); } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
例子的链接http://wptrafficanalyzer.in/blog/implement-swiping-between-tabs-with-viewpager-in-action-bar-using-sherlock-library/ 有兴趣的同学去看看吧