在Android 3.0以后 Tabhost被标记为Deprecated,官方建议我们使用FragmentTabHost,这里用 FragmentTabHost +Fragment 来实现之前已经实现过的 新浪微博布局效果。
关于FragmentTabHost 的说明可以参考 http://developer.android.com/reference/android/support/v4/app/FragmentTabHost.html
maintabs.xml
<android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/> <FrameLayout android:id="@+id/realtabcontent" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.0" android:visibility="gone"/> <RelativeLayout android:id="@+id/layout_bottom" android:layout_width="fill_parent" android:layout_height="wrap_content" > <RadioGroup android:id="@+id/radiogroup" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:background="@drawable/tabbar_background" android:gravity="center_vertical" android:orientation="horizontal" > <RadioButton android:id="@+id/radio_home" style="@style/maintabt" android:drawableTop="@drawable/icon_home" android:text="主页" /> <RadioButton android:id="@+id/radio_msg" style="@style/maintabt" android:drawableTop="@drawable/icon_meassage" android:text="消息" /> <RadioButton android:id="@+id/radio_profile" style="@style/maintabt" android:drawableTop="@drawable/icon_profile" android:text="我" /> <RadioButton android:id="@+id/radio_square" style="@style/maintabt" android:drawableTop="@drawable/icon_square" android:text="广场" /> <RadioButton android:id="@+id/radio_more" style="@style/maintabt" android:drawableTop="@drawable/icon_more" android:text="更多" /> </RadioGroup> </RelativeLayout> </LinearLayout> </android.support.v4.app.FragmentTabHost>
FragmentTabsActivity.java
public class FragmentTabsActivity extends FragmentActivity implements OnCheckedChangeListener { private static final String TAG = FragmentTabsActivity.class .getSimpleName(); private FragmentTabHost mTabHost; private RadioGroup radioGroup; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.maintabs); findView(); } private void findView() { mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); mTabHost.getTabWidget().setVisibility(View.GONE); // 隐藏系统的TabWidget mTabHost.addTab(mTabHost.newTabSpec("home").setIndicator("Home"), HomeFragment.class, null); mTabHost.addTab(mTabHost.newTabSpec("message").setIndicator("Message"), MessageFragment.class, null); mTabHost.addTab(mTabHost.newTabSpec("profile").setIndicator("Profile"), ProfileFragment.class, null); mTabHost.addTab(mTabHost.newTabSpec("square").setIndicator("Square"), SquareFragment.class, null); mTabHost.addTab(mTabHost.newTabSpec("more").setIndicator("More"), MoreFragment.class, null); // mTabHost.setOnTabChangedListener(this); mTabHost.setCurrentTabByTag("home"); ((RadioButton) findViewById(R.id.radio_home)).setChecked(true); radioGroup = (RadioGroup) findViewById(R.id.radiogroup); radioGroup.setOnCheckedChangeListener(this); } @Override public void onCheckedChanged(RadioGroup group, int checkedId) { FragmentManager fm = getSupportFragmentManager(); HomeFragment homeFragment = (HomeFragment) fm.findFragmentByTag("home"); MessageFragment msgFragment = (MessageFragment) fm .findFragmentByTag("message"); ProfileFragment profileFragment = (ProfileFragment) fm .findFragmentByTag("profile"); SquareFragment squareFragment = (SquareFragment) fm .findFragmentByTag("square"); MoreFragment moreFragment = (MoreFragment) fm.findFragmentByTag("more"); FragmentTransaction ft = fm.beginTransaction(); // ** Detaches the androidfragment if exists */ if (homeFragment != null) ft.detach(homeFragment); if (msgFragment != null) ft.detach(msgFragment); if (profileFragment != null) ft.detach(profileFragment); if (squareFragment != null) ft.detach(squareFragment); if (moreFragment != null) ft.detach(moreFragment); switch (checkedId) { case R.id.radio_home: if (homeFragment == null) { /** Create AndroidFragment and adding to fragmenttransaction */ ft.add(R.id.realtabcontent, new HomeFragment(), "home"); } else { /** * Bring to the front, if already exists in the * fragmenttransaction */ ft.attach(homeFragment); } mTabHost.setCurrentTabByTag("home"); break; case R.id.radio_msg: if (msgFragment == null) { ft.add(R.id.realtabcontent, new MessageFragment(), "message"); } else { ft.attach(msgFragment); } mTabHost.setCurrentTabByTag("message"); break; case R.id.radio_profile: if (profileFragment == null) { ft.add(R.id.realtabcontent, new ProfileFragment(), "profile"); } else { ft.attach(profileFragment); } mTabHost.setCurrentTabByTag("profile"); break; case R.id.radio_square: if (squareFragment == null) { ft.add(R.id.realtabcontent, new SquareFragment(), "square"); } else { ft.attach(squareFragment); } mTabHost.setCurrentTabByTag("square"); break; case R.id.radio_more: if (moreFragment == null) { ft.add(R.id.realtabcontent, new MoreFragment(), "more"); } else { ft.attach(moreFragment); } mTabHost.setCurrentTabByTag("more"); break; default: break; } ft.commitAllowingStateLoss(); } }
FragmentTabHost 用法和TabHost 用法差不多,自己看看官方文档就明白了。
工程下载地址:http://download.csdn.net/detail/fx_sky/6608547
更正:
onCheckedChanged方法里面,最后是需要ft.commit();这句话的,由于个人马虎给大家造成误解表示道歉。完整代码如下:
@Override public void onCheckedChanged(RadioGroup group, int checkedId) { FragmentManager fm = getSupportFragmentManager(); HomeFragment homeFragment = (HomeFragment) fm.findFragmentByTag("home"); MessageFragment msgFragment = (MessageFragment) fm .findFragmentByTag("message"); ProfileFragment profileFragment = (ProfileFragment) fm .findFragmentByTag("profile"); SquareFragment squareFragment = (SquareFragment) fm .findFragmentByTag("square"); MoreFragment moreFragment = (MoreFragment) fm.findFragmentByTag("more"); FragmentTransaction ft = fm.beginTransaction(); // ** Detaches the androidfragment if exists */ if (homeFragment != null) ft.detach(homeFragment); if (msgFragment != null) ft.detach(msgFragment); if (profileFragment != null) ft.detach(profileFragment); if (squareFragment != null) ft.detach(squareFragment); if (moreFragment != null) ft.detach(moreFragment); switch (checkedId) { case R.id.radio_home: if (homeFragment == null) { /** Create AndroidFragment and adding to fragmenttransaction */ ft.add(R.id.realtabcontent, new HomeFragment(), "home"); } else { /** * Bring to the front, if already exists in the * fragmenttransaction */ ft.attach(homeFragment); } mTabHost.setCurrentTabByTag("home"); break; case R.id.radio_msg: if (msgFragment == null) { ft.add(R.id.realtabcontent, new MessageFragment(), "message"); } else { ft.attach(msgFragment); } mTabHost.setCurrentTabByTag("message"); break; case R.id.radio_profile: if (profileFragment == null) { ft.add(R.id.realtabcontent, new ProfileFragment(), "profile"); } else { ft.attach(profileFragment); } mTabHost.setCurrentTabByTag("profile"); break; case R.id.radio_square: if (squareFragment == null) { ft.add(R.id.realtabcontent, new SquareFragment(), "square"); } else { ft.attach(squareFragment); } mTabHost.setCurrentTabByTag("square"); break; case R.id.radio_more: if (moreFragment == null) { ft.add(R.id.realtabcontent, new MoreFragment(), "more"); } else { ft.attach(moreFragment); } mTabHost.setCurrentTabByTag("more"); break; default: break; } ft.commitAllowingStateLoss(); }