仿安智市場UI框架佈局之fragment+tabhost底部菜單

第一部分就是大家如今看的這個貼,主要功能:實現fragment_+tabhost來搭建整個app的大致UI框架,底部是一個可切換的選項卡(安智市場中的底部選項卡的切換動畫效果略過,沒寫,太困了,碼完字去睡覺)。

第二部分:也就是這個即將寫的下一個帖子,由於今天實在太晚了,明天還要上班(Zzzzz...),主要功能:使用viewpagerindicator控件,實現左右滑動加載分頁數據,還有android 4.2更新的新特性:Fragment in fragment(嵌套)。    這部分很快會更新。真的。 

<br>如今來看看安智市場的app效果   
<br>而後來看看如今這個帖子要實現的功能的demo效果    不會很難看吧,見笑了!呵呵!!!動畫效果沒作。木有時間。

<br>如今來講說代碼,其實我以前在eoe寫過一個相似的,不過如今理解更深入,有改進一部分。
首先必須是佈局文件啦,主要的佈局文件是:activity_main.xml
  1. <TabHost
  2.     xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:id="@android :id/tabhost"
  4.     android:layout_width="match_parent"
  5.     android:layout_height="match_parent">

  6.     <LinearLayout
  7.         android:orientation="vertical"
  8.         android:layout_width="match_parent"
  9.         android:layout_height="match_parent">

  10.         <FrameLayout
  11.             android:id="@+id/realtabcontent"
  12.             android:layout_width="match_parent"
  13.             android:layout_height="0dp"
  14.             android:layout_weight="1"/>  
  15.         
  16.         <TabWidget
  17.             android:id="@android :id/tabs"
  18.             android:layout_width="match_parent"
  19.             android:layout_height="wrap_content"
  20.             android:tabStripEnabled="false"
  21.             android:background="@drawable/bg_nav"
  22.             android:layout_weight="0"/>
  23.         
  24.         <FrameLayout
  25.             android:id="@android :id/tabcontent"
  26.             android:layout_width="0dp"
  27.             android:layout_height="0dp"
  28.             android:layout_weight="0"/>

  29.     </LinearLayout>
  30. </TabHost>
複製代碼
也木有啥,就是一個tabwidget控件,是底部的選項卡按鈕的,而後,第一個frameLayout是上圖中實際內容的部分。
接下來,最重要的,固然是fragment咯,首先若是有和我同樣無知的孩子,仍是得先了解一下什麼是fragment吧。
傳送門:http://developer.android.com/reference/android/support/v4/app/Fragment.html
而後,我小小的說明一下咯,fragment是在android sdk 3.0以後出現的,爲了給用戶帶來更好的UE,解決不一樣屏幕分辯率的動態和靈活UI設計。大屏幕如平板小屏幕如手機,平板電腦的設計使得其有更多的空間來放更多的UI組件,而多出來的空間存放UI使其會產生更多的交互,從而誕生了fragments。fragment有它本身的一套生命週期機制,和activity同樣。不過它必須擁有一個activity宿主,以此管理這些fragments。要使用fragment,必須引入v4類庫包(android-support-v4.jar),這樣雖然fragment是在3.0之後出現的,也一樣能夠在低版本中使用。

上代碼吧,我詞窮。
  1. package org.mcdull.activity;

  2. import org.mcdull.mainfragment.FifthFragment;
  3. import org.mcdull.mainfragment.FourthFragment;
  4. import org.mcdull.mainfragment.FristFragment;
  5. import org.mcdull.mainfragment.SecondFragment;
  6. import org.mcdull.mainfragment.ThirdFragment;
  7. import org.mcdull.util.DummyTabContent;

  8. import android.os.Bundle;
  9. import android.support.v4.app.FragmentActivity;
  10. import android.support.v4.app.FragmentManager;
  11. import android.support.v4.app.FragmentTransaction;
  12. import android.view.LayoutInflater;
  13. import android.widget.ImageView;
  14. import android.widget.LinearLayout;
  15. import android.widget.RelativeLayout;
  16. import android.widget.TabHost;
  17. import android.widget.TabWidget;
  18. import android.widget.TextView;

  19. /**
  20. * @description: 

  21. *
  22. * @author: hades
  23. *
  24. * @update: 2013-3-7
  25. *
  26. * @version: 1.0
  27. * 
  28. * @email:mcdull525@foxmail.com
  29. */
  30. public class MainActivity extends FragmentActivity {

  31.         private TabHost mTabHost;
  32.         TabWidget tabWidget;
  33.         private FragmentTransaction mFt;
  34.         private RelativeLayout mTabIndicator_home, mTabIndicator_app,
  35.                         mTabIndicator_game, mTabIndicator_top, mTabIndicator_setting;
  36.         private FristFragment mFristFragment;
  37.         private SecondFragment mSecondFragment;
  38.         private ThirdFragment mThirdFragment;
  39.         private FourthFragment mFourthFragment;
  40.         private FifthFragment mFifthFragment;
  41.         private FragmentManager mFm = getSupportFragmentManager();

  42.         @Override
  43.         protected void onCreate(Bundle savedInstanceState) {
  44.                 super.onCreate(savedInstanceState);
  45.                 setContentView(R.layout.activity_main);
  46.                 findTabView();
  47.                 mTabHost.setup();

  48.                 TabHost.OnTabChangeListener tabChangeListener = new TabHost.OnTabChangeListener() {

  49.                         @Override
  50.                         public void onTabChanged(String tabId) {

  51.                                 mFt = mFm.beginTransaction();

  52.                                 // TODO Auto-generated method stub
  53.                                 if (mFristFragment != null) {
  54.                                         mFt.hide(mFristFragment);
  55.                                 }
  56.                                 if (mSecondFragment != null) {
  57.                                         mFt.hide(mSecondFragment);
  58.                                 }
  59.                                 if (mThirdFragment != null) {
  60.                                         mFt.hide(mThirdFragment);
  61.                                 }
  62.                                 if (mFourthFragment != null) {
  63.                                         mFt.hide(mFourthFragment);
  64.                                 }
  65.                                 if (mFifthFragment != null) {
  66.                                         mFt.hide(mFifthFragment);
  67.                                 }

  68.                                 if (tabId.equalsIgnoreCase("home")) {
  69.                                         attachTabHome();
  70.                                 } else if (tabId.equalsIgnoreCase("app")) {
  71.                                         attachTabApp();
  72.                                 } else if (tabId.equalsIgnoreCase("game")) {
  73.                                         attachTabGame();
  74.                                 } else if (tabId.equalsIgnoreCase("top")) {
  75.                                         attachTabTop();
  76.                                 } else if (tabId.equalsIgnoreCase("setting")) {
  77.                                         attachTabSetting();
  78.                                 }
  79.                                 // 執行Fragment事務(添加。移除,替換fragment)
  80.                                 mFt.commit();
  81.                         }
  82.                 };
  83.                 mTabHost.setOnTabChangedListener(tabChangeListener);
  84.                 initTab();
  85.                 //默認跳到第幾個選項卡
  86.                 mTabHost.setCurrentTab(0);
  87.         }

  88.         /**
  89.          * 找到TabHost的相關佈局,並繪製每個選項卡

  90.          */
  91.         private void findTabView() {

  92.                 mTabHost = (TabHost) findViewById(android.R.id.tabhost);
  93.                 tabWidget = (TabWidget) findViewById(android.R.id.tabs);
  94.                 LinearLayout layout = (LinearLayout) mTabHost.getChildAt(0);
  95.                 TabWidget tabWidget = (TabWidget) layout.getChildAt(1);

  96.                 mTabIndicator_home = (RelativeLayout) LayoutInflater.from(this)
  97.                                 .inflate(R.layout.tab_indicator, tabWidget, false);
  98.                 ImageView ivTab1 = (ImageView) mTabIndicator_home.getChildAt(0);
  99.                 ivTab1.setImageResource(R.drawable.selector_menu_home_btu);
  100.                 TextView tvTab1 = (TextView) mTabIndicator_home.getChildAt(1);
  101.                 tvTab1.setText(R.string.home);

  102.                 mTabIndicator_app = (RelativeLayout) LayoutInflater.from(this).inflate(
  103.                                 R.layout.tab_indicator, tabWidget, false);
  104.                 ImageView ivTab2 = (ImageView) mTabIndicator_app.getChildAt(0);
  105.                 ivTab2.setImageResource(R.drawable.selector_menu_app_btu);
  106.                 TextView tvTab2 = (TextView) mTabIndicator_app.getChildAt(1);
  107.                 tvTab2.setText(R.string.app);

  108.                 mTabIndicator_game = (RelativeLayout) LayoutInflater.from(this)
  109.                                 .inflate(R.layout.tab_indicator, tabWidget, false);
  110.                 ImageView ivTab3 = (ImageView) mTabIndicator_game.getChildAt(0);
  111.                 ivTab3.setImageResource(R.drawable.selector_menu_game_btu);
  112.                 TextView tvTab3 = (TextView) mTabIndicator_game.getChildAt(1);
  113.                 tvTab3.setText(R.string.game);

  114.                 mTabIndicator_top = (RelativeLayout) LayoutInflater.from(this).inflate(
  115.                                 R.layout.tab_indicator, tabWidget, false);
  116.                 ImageView ivTab4 = (ImageView) mTabIndicator_top.getChildAt(0);
  117.                 ivTab4.setImageResource(R.drawable.selector_menu_top_btu);
  118.                 TextView tvTab4 = (TextView) mTabIndicator_top.getChildAt(1);
  119.                 tvTab4.setText(R.string.top);

  120.                 mTabIndicator_setting = (RelativeLayout) LayoutInflater.from(this)
  121.                                 .inflate(R.layout.tab_indicator, tabWidget, false);
  122.                 ImageView ivTab5 = (ImageView) mTabIndicator_setting.getChildAt(0);
  123.                 ivTab5.setImageResource(R.drawable.selector_menu_setting_btu);
  124.                 TextView tvTab5 = (TextView) mTabIndicator_setting.getChildAt(1);
  125.                 tvTab5.setText(R.string.setting);

  126.         }

  127.         /**
  128.          * 如下一系列方法都是判斷fragment是否已經建立,防止重複add進FragmentTransaction 

  129.          * FragmentTransaction中提供了show,add,replace,hide等一系列方法,能夠根據不一樣的需求 

  130.          * 使用,這裏demo使用了show方法,是由於避免使用replace以後會從新建立fragment,從新加載數據 

  131.          */
  132.         private void attachTabHome() {

  133.                 if (mFristFragment == null) {
  134.                         mFristFragment = new FristFragment();
  135.                         mFt.add(R.id.realtabcontent, mFristFragment, "home");
  136.                 } else {
  137.                         mFt.show(mFristFragment);
  138.                         
  139.                 }
  140.         }

  141.         private void attachTabApp() {

  142.                 if (mSecondFragment == null) {
  143.                         mSecondFragment = new SecondFragment();
  144.                         mFt.add(R.id.realtabcontent, mSecondFragment, "app");
  145.                 } else {
  146.                         mFt.show(mSecondFragment);
  147.                 }
  148.         }

  149.         private void attachTabGame() {

  150.                 if (mThirdFragment == null) {
  151.                         mThirdFragment = new ThirdFragment();
  152.                         mFt.add(R.id.realtabcontent, mThirdFragment, "game");
  153.                 } else {
  154.                         mFt.show(mThirdFragment);
  155.                 }
  156.         }

  157.         private void attachTabTop() {

  158.                 if (mFourthFragment == null) {
  159.                         mFourthFragment = new FourthFragment();
  160.                         mFt.add(R.id.realtabcontent, mFourthFragment, "top");
  161.                 } else {
  162.                         mFt.show(mFourthFragment);
  163.                 }
  164.         }

  165.         private void attachTabSetting() {

  166.                 if (mFifthFragment == null) {
  167.                         mFifthFragment = new FifthFragment();
  168.                         mFt.add(R.id.realtabcontent, mFifthFragment, "setting");
  169.                 } else {
  170.                         mFt.show(mFifthFragment);
  171.                 }
  172.         }

  173.         /**
  174.          * 初始化選項卡 

  175.          */
  176.         private void initTab() {

  177.                 TabHost.TabSpec tSpecHome = mTabHost.newTabSpec("home");
  178.                 tSpecHome.setIndicator(mTabIndicator_home);
  179.                 tSpecHome.setContent(new DummyTabContent(getBaseContext()));
  180.                 mTabHost.addTab(tSpecHome);

  181.                 TabHost.TabSpec tSpecApp = mTabHost.newTabSpec("app");
  182.                 tSpecApp.setIndicator(mTabIndicator_app);
  183.                 tSpecApp.setContent(new DummyTabContent(getBaseContext()));
  184.                 mTabHost.addTab(tSpecApp);

  185.                 TabHost.TabSpec tSpecGame = mTabHost.newTabSpec("game");
  186.                 tSpecGame.setIndicator(mTabIndicator_game);
  187.                 tSpecGame.setContent(new DummyTabContent(getBaseContext()));
  188.                 mTabHost.addTab(tSpecGame);

  189.                 TabHost.TabSpec tSpecTop = mTabHost.newTabSpec("top");
  190.                 tSpecTop.setIndicator(mTabIndicator_top);
  191.                 tSpecTop.setContent(new DummyTabContent(getBaseContext()));
  192.                 mTabHost.addTab(tSpecTop);

  193.                 TabHost.TabSpec tSpecSetting = mTabHost.newTabSpec("setting");
  194.                 tSpecSetting.setIndicator(mTabIndicator_setting);
  195.                 tSpecSetting.setContent(new DummyTabContent(getBaseContext()));
  196.                 mTabHost.addTab(tSpecSetting);

  197.         }

  198. }
複製代碼
這裏須要提醒幾點:第一,這個mainActivity繼承與fragmentActivity;
第二:        private FragmentManager mFm = getSupportFragmentManager(); 第一點繼承了fragmentActivity後,可經過 getSupportFragmentManager方法拿到FragmentManager, 這個類提供了與Activity內部的Fragment對象進行交互的接口,其餘的看代碼撒。
相關文章
相關標籤/搜索