自訂標籤頁(TabHost+TabWidget)的使用


在 "標籤頁(TabHost+TabWidget)的使用" 提到預設標籤頁的使用,實際上的應用卻不會使用預設標籤頁,因為介面美觀實在不夠,1個好的應用除了內容外,其 UI 的包裝也是相當重要, 這裡介紹如何使用自訂的標籤頁,如下圖



















首先來看看 TabHost 套用的佈局檔,如下

   1:  <?xml version="1.0" encoding="utf-8"?>
   2:  <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
   3:      android:id="@android:id/tabhost"
   4:      android:layout_width="fill_parent"
   5:      android:layout_height="fill_parent" >
   6:   
   7:      <LinearLayout
   8:          android:id="@+id/LinearLayout01"
   9:          android:layout_width="fill_parent"
  10:          android:layout_height="fill_parent"
  11:          android:orientation="vertical" >
  12:   
  13:          <!-- Admob add here -->
  14:   
  15:          <LinearLayout
  16:              android:id="@+id/AdLayout"
  17:              android:layout_width="wrap_content"
  18:              android:layout_height="wrap_content" >
  19:          </LinearLayout>
  20:   
  21:          <TabWidget
  22:              android:id="@android:id/tabs"
  23:              android:layout_width="fill_parent"
  24:              android:layout_height="wrap_content"
  25:              android:visibility="gone" />
  26:   
  27:          <!-- framelayout put here will be buttom -->
  28:   
  29:          <RadioGroup
  30:              android:id="@+id/tab_group"
  31:              android:layout_width="fill_parent"
  32:              android:layout_height="50dp"
  33:              android:layout_gravity="bottom"
  34:              android:background="@drawable/background1"
  35:              android:checkedButton="@+id/tab1"
  36:              android:gravity="center_vertical"
  37:              android:orientation="horizontal" >
  38:   
  39:  <!--             button set null that will remove default radio button -->
  40:   
  41:              <RadioButton
  42:                  android:id="@id/tab1"
  43:                  android:layout_width="fill_parent"
  44:                  android:layout_height="fill_parent"
  45:                  android:layout_marginTop="1.0dip"
  46:                  android:layout_weight="1.0"
  47:                  android:background="@drawable/tab_bg_selector"
  48:                  android:button="@null"
  49:                  android:gravity="center"
  50:                  android:tag="tab1"
  51:                  android:text="消費清單" />
  52:   
  53:              <RadioButton
  54:                  android:id="@+id/tab2"
  55:                  android:layout_width="fill_parent"
  56:                  android:layout_height="fill_parent"
  57:                  android:layout_marginTop="1.0dip"
  58:                  android:layout_weight="1.0"
  59:                  android:background="@drawable/tab_bg_selector"
  60:                  android:button="@null"
  61:                  android:gravity="center"
  62:                  android:text="本日消費" />
  63:   
  64:              <RadioButton
  65:                  android:id="@+id/tab3"
  66:                  android:layout_width="fill_parent"
  67:                  android:layout_height="fill_parent"
  68:                  android:layout_marginTop="1.0dip"
  69:                  android:layout_weight="1.0"
  70:                  android:background="@drawable/tab_bg_selector"
  71:                  android:button="@null"
  72:                  android:gravity="center"
  73:                  android:text="本周消費" />
  74:   
  75:              <RadioButton
  76:                  android:id="@+id/tab4"
  77:                  android:layout_width="fill_parent"
  78:                  android:layout_height="fill_parent"
  79:                  android:layout_marginTop="1.0dip"
  80:                  android:layout_weight="1.0"
  81:                  android:background="@drawable/tab_bg_selector"
  82:                  android:button="@null"
  83:                  android:gravity="center"
  84:                  android:text="本月消費" />
  85:          </RadioGroup>
  86:   
  87:          <!-- framelayout put here will be Top -->
  88:          <FrameLayout
  89:              android:id="@android:id/tabcontent"
  90:              android:layout_width="fill_parent"
  91:              android:layout_height="0.0dip"
  92:              android:layout_weight="1.0" />
  93:          
  94:      </LinearLayout>
  95:   
  96:  </TabHost>

第 7 行指出使用垂直線性排版
第 8 ~ 11 行為 LinearLayout 的內容
第 13 ~ 19 行為 Admob 的使用,如果沒有 admob 可以忽略
第 21 ~ 25 行為原先的 TabWidget ,注意 25 行我們直接讓它不顯示,也不會作用
第 29 ~ 85 行為取代 TabWidget 的 RadioGroup , 裡面有 4 個 RadioButton 分別在 41, 53, 64, 75 行
第 32 行設定高度
第 33 行設定在畫面底部
第 34 行設定底圖為 background1,為1張 png 圖,它會設定在整個按鈕的下方,注意這張圖的寬高
第 36 行設定其內容按鈕為橫向排列
第 41 ~ 51 行為第 1 個按鈕的設定
第 42 行設定其 id, 注意這個 id 名稱會連結到程式碼中
第 43 ~ 44 行設定尺寸
第 45 行距離上方多 1 dp
第 46 行設定 weight 為 1.0
第 47 行設定按鈕的格式為 xml 檔,注意它決定按鈕顯示的外觀,其內容如下

   1:  <?xml version="1.0" encoding="utf-8"?>
   2:  <selector xmlns:android="http://schemas.android.com/apk/res/android">
   3:   
   4:      <item android:drawable="@drawable/button1" android:state_focused="true"/>
   5:      <item android:drawable="@drawable/button2" android:state_pressed="true"/>
   6:      <item android:drawable="@drawable/button3" android:state_checked="true"/>
   7:   
   8:  </selector>

第 4 行無作用
第 5 行為按鈕被按下的顯示圖片,注意圖片寬高
第 6 行為按鈕被選擇的顯示圖片,注意圖片寬高

第 48 行設定為 null ,以去除預設的按鈕外觀
第 50 行設定其 tag, 注意這個 tag 名稱會連結到程式碼中
第 51 行設定顯示字樣,其他按鈕也是類似的設定
第 88 ~ 92 行為 framelayout 的設定, 注意它也可以放在第 27 行 ,如此按鈕們都會移動到畫面底部

看完  TabHost 套用的佈局檔後,接著來看看其程式碼

   1:  package com.example.helloworld;
   2:   
   3:  import android.app.TabActivity;
   4:  import android.content.Intent;
   5:  import android.os.Bundle;
   6:  import android.view.animation.Animation;
   7:  import android.view.animation.ScaleAnimation;
   8:  import android.widget.LinearLayout;
   9:  import android.widget.RadioButton;
  10:  import android.widget.RadioGroup;
  11:  import android.widget.RadioGroup.OnCheckedChangeListener;
  12:  import android.widget.TabHost;
  13:   
  14:  import com.google.ads.AdRequest;
  15:  import com.google.ads.AdSize;
  16:  import com.google.ads.AdView;
  17:   
  18:  @SuppressWarnings("deprecation")
  19:  public class Table_Flow extends TabActivity{
  20:   
  21:      
  22:      private RadioGroup tabGroup;
  23:      
  24:      private RadioButton rb1;
  25:      private RadioButton rb2;
  26:      private RadioButton rb3;
  27:      private RadioButton rb4;
  28:      
  29:      private TabHost thost;
  30:      
  31:      public void onCreate(Bundle savedInstanceState){
  32:          super.onCreate(savedInstanceState);
  33:          
  34:          setContentView(R.layout.table_host);
  35:          
  36:  //        showAdmob();
  37:          
  38:          initView();
  39:      }
  40:      
  41:      
  42:      void initView(){
  43:          
  44:          thost = getTabHost();// build tabhost
  45:          
  46:          tabGroup = (RadioGroup) findViewById(R.id.tab_group);
  47:          
  48:          rb1 = (RadioButton)findViewById(R.id.tab1);
  49:          rb2 = (RadioButton)findViewById(R.id.tab2);
  50:          rb3 = (RadioButton)findViewById(R.id.tab3);
  51:          rb4 = (RadioButton)findViewById(R.id.tab4);
  52:          
  53:          Intent inte1 = new Intent(this, Table_widget4.class);
  54:          Intent inte2 = new Intent(this, Table_widget1.class);
  55:          Intent inte3 = new Intent(this, Table_widget2.class);
  56:          Intent inte4 = new Intent(this, Table_widget3.class);
  57:          
  58:          thost.addTab(thost.newTabSpec("TAB1").setIndicator("tab1").setContent(inte1));
  59:          thost.addTab(thost.newTabSpec("TAB4").setIndicator("tab4").setContent(inte2));
  60:          thost.addTab(thost.newTabSpec("TAB2").setIndicator("tab2").setContent(inte3));
  61:          thost.addTab(thost.newTabSpec("TAB3").setIndicator("tab3").setContent(inte4));
  62:                  
  63:          
  64:          tabGroup.setOnCheckedChangeListener(new    OnTabChangeListener());
  65:   
  66:      }
  67:      
  68:       private class OnTabChangeListener implements OnCheckedChangeListener {
  69:   
  70:              @Override
  71:              public void onCheckedChanged(RadioGroup group, int id) {
  72:                  // TODO Auto-generated method stub
  73:                  
  74:                  //button anim
  75:                  Animation scalybig = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f);
  76:                  scalybig.setDuration(500);
  77:                  
  78:                  
  79:                  switch(id){
  80:                  
  81:                  case R.id.tab1:
  82:                      thost.setCurrentTabByTag("TAB1");                    
  83:                      rb1.startAnimation(scalybig);                    
  84:                      break;
  85:                      
  86:                  case R.id.tab2:
  87:                      thost.setCurrentTabByTag("TAB2");        
  88:                      rb2.startAnimation(scalybig);                    
  89:                      break;
  90:                      
  91:                  case R.id.tab3:
  92:                      thost.setCurrentTabByTag("TAB3");                
  93:                      rb3.startAnimation(scalybig);                    
  94:                      break;
  95:                      
  96:                  case R.id.tab4:
  97:                      thost.setCurrentTabByTag("TAB4");                    
  98:                      rb4.startAnimation(scalybig);
  99:   
 100:                      break;
 101:                  }
 102:                  
 103:              }
 104:              
 105:       }
 106:      
 107:      
 108:      void showAdmob(){
 109:          
 110:      AdView adView;
 111:          
 112:  //        Create the adView     
 113:         adView = new AdView(this, AdSize.BANNER, "a150189a3abeb1a");      
 114:   
 115:         LinearLayout layout = (LinearLayout)findViewById(R.id.AdLayout);      
 116:            
 117:         layout.addView(adView);
 118:         
 119:         adView.loadAd(new AdRequest()); 
 120:      }
 121:  }
 122:   
 123:   
 124:   

事實上內容也沒有太大的改變,只是加入 RadioGroup
第 34 行套用上述的佈局檔
第 36 行為 Admob 的使用,目前不用
第 46 行取得 RadioGroup, 注意 id 要對應 xml 中的設定
第 48 ~ 51 行取得 4 個按鈕, 我針對按鈕有做點選後的動畫
第 53 ~ 56 行設定 4 個 Intent
第 58 ~ 61 行設定 4 個按鈕對應的內容, 注意 setIndicator("") 和 setContent(),其傳入參數必須對應 xml 中的設定
第 64 行設定按鈕們的監聽器,其內容在 68 ~ 105 行
第 71 行覆寫 onCheckedChanged 方法
第 75 ~ 76 行為按鈕被按下時播放的動畫
第 79 ~ 101 行為按鈕按下切換的方法,注意 case 對應的 id 和 setCurrentTabByTag 的 id 必須符合







0 意見:

張貼留言

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Affiliate Network Reviews