[Android] 建立Tab View的三種方式(下)

建立Tab View的三種方式(上)一文中介紹了如何透過將Tab Content寫在同一個Activity的方式來呈現Tab Layout,包含以View Id、TabContentFactory等兩種方法。而建立Tab Content的另一種方式是將每個Tab的內容分別以不同的Activity呈現,以下將針對這個方法進行說明。


不同Tab內容寫在不同Activity(Different Tab Content in different Activity)

程式碼說明:

1. 分別撰寫代表不同Tab內容的Activity,本例以Tab1、Tab2兩個Activity表示,每個Activity只簡單顯示TextView,如下圖的Tab1 Activity(記得在AndroidManifest.xml裡加入新增的Activity)。

tab1.xml
package com.CreateTab;

import android.app.Activity;
import android.os.Bundle;

public class Tab1 extends Activity {
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab1);
 }
}

2. 將tab加入TabHost,並以setContent(Intent intent)將Activity與Tab產生連結,當使用者點選TabWidget上的Tabs時,便會以setContent所代入的Intent參數,將TabContentView導向intent的目標Activity。
public class CreateTab extends TabActivity{
    /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
        
      //取得Tabhost參考
      TabHost tabHost = getTabHost();
        
      //設定各tab頁面by指定View id
      tabHost.addTab(tabHost
           .newTabSpec("tab1")
           .setIndicator("TAB1")
           .setContent(new Intent(this, Tab1.class))
      );
         
      tabHost.addTab(tabHost
            .newTabSpec("tab2")
            .setIndicator("TAB2")
            .setContent(new Intent(this, Tab2.class))
      );
    }
}


將不同tab內容以個別的Activity呈現,對於要用tab呈現較複雜功能的Application是可以優先採用的作法,如果將許多複雜且大量的tab呈現邏輯全部放在同一個Activity,將造成維護上很大的困難,日後要進行功能擴充更動也不容易,還可以運用Activity Life Cycle來針對程式目前現況來進行tab view動態調整,程式設計者可以針對自己的需要來選用適合的方法。

留言

  1. 您好,可否向您請教關於android的撰寫相關問題?
    我現在日本鄉下的專門學校讀書,
    學期作業要交一個android的app作品。
    因為課堂上學的很有限,
    住在鄉下要買相關書籍不易,
    且因為日文能力不足,
    所以實在是一個頭兩個大
    雖然看了您的文較為瞭解了
    但仍是做不出tab
    是否可以教我~~~ please!!

    回覆刪除
  2. 請問你遇到怎樣的問題?

    回覆刪除
  3. 作者已經移除這則留言。

    回覆刪除
  4. 其實你遇到的都是小問題,包含了android xml檔案的命名規則、r.id的用法以及import package…等,其實IDE下面的錯誤訊息都蠻清楚的,建議你可以自己試著找出問題,這樣可以獲得更多

    回覆刪除
  5. 謝謝,我會再多試試。

    回覆刪除
  6. 不客氣,有問題歡迎一起交流~

    回覆刪除
  7. 您好
    Tab view我已經試成功了!!!
    謝謝您的提點 m(_ _)m

    回覆刪除
  8. 您好~請問一下!!為什麼我的Activity內容跑不出來!
    我用的是方法三~tab跑的出來,也可以按,就是activity裡面沒有內容!

    回覆刪除
  9. 會不會是你的tab Activity沒有透過setContentView指定其Layout,或是其layout的xml檔沒有寫好

    回覆刪除
  10. 不好意思,請問方法三中~main.layout是否需要額外設計呢?
    就是在eclipse中將tabhost給拉進去
    謝謝

    回覆刪除
  11. 其實如果是預設的Tab View Layout
    是不用透過setContentView()來指定Layout
    系統會自動幫你設定預設layout
    除非要使用包含tab view的客制外觀
    詳細可以看我的文章:
    http://jimmy319.blogspot.com/2012/02/android-androididid-idtabactiviry.html

    回覆刪除
  12. 請問我在網頁A是ListView 選了某一項後跳到網頁B,而網頁B就是用此方法做出的tabHost,但是網頁B一直都為橫式,我在AndroidManifest.xml設定永遠直式,在CreateTab 這頁也有設定直式,還是沒動靜><

    回覆刪除
  13. 你是透過什麼設定讓View的orientation固定為直式?

    回覆刪除
  14. 已經解決了!我又有一個新問題><我參考此方法產生TabHost,想在Tab1預設就開啟網頁,我是在Tab1.class裡onCreate 就load一個網頁至WebView,並加入onPageStarted有載入中的message,onPageFinished時關閉,但會出現 leaked window 問題,搜尋網路解法 加入OnDestroy()也相同錯誤,不知道是我加錯地方還是哪出錯?!

    回覆刪除
  15. 你有完整的錯誤log嗎?不過就你提到的錯誤關鍵字與你有popup載入中的message,我猜可能是你在沒關掉popup dialog的情形下,就把activity finish了

    回覆刪除
  16. 還有一個問題><
    請問tab1如何丟參數給CreateTab ,且通知Create
    Tab裡有一個Textview要更新為收到的參數?

    回覆刪除
  17. 錯誤:04-02 08:55:40.965: E/WindowManager(7504): Activity com.test.ShowRoute has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@45fd11b0 that was originally added here

    程式:
    Tab1的onCreate 裡
    onCreate(Bundle savedInstanceState)
    mWebView01.setWebViewClient(new WebViewClient(){

    ProgressDialog d=new ProgressDialog(Tab1.this);

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
    d.setMessage("載入中");
    d.show();
    }

    ⋯⋯ @Override
    public void onPageFinished(WebView view, String url) {
    d.dismiss();
    super.onPageFinished(view, url);
    }
    });

    回覆刪除
  18. To Yatin:

    如果我理解沒錯,你的CreateTab Activity除了Tab widget外還有一個TextView,然後這個TextView會依照tab裡的某些動作而改變它顯示的文字?如果是這樣,建議你不要使用Activity建立tab,請參考建立Tab View的三種方式(上)將tab內容寫在同個Activity,這樣TextView要接受參數就變得十分容易了

    ps. 記得TabActivity使用Custom view時,要注意Tab widget的命名規則

    回覆刪除
  19. 我用(TextView)parentActivity.findViewById 能抓到了!!但popup dialog解決不了><你有看到我貼的錯誤碼嗎?

    回覆刪除
  20. 可能妳要提供完整相關的程式碼才可能知道問題在哪

    回覆刪除
  21. 錯誤:04-02 08:55:40.965: E/WindowManager(7504): Activity com.test.ShowRoute has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@45fd11b0 that was originally added here

    程式:
    Tab1的onCreate 裡
    onCreate(Bundle savedInstanceState)
    mWebView01.setWebViewClient(new WebViewClient(){

    ProgressDialog d=new ProgressDialog(Tab1.this);

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
    d.setMessage("載入中");
    d.show();
    }

    @Override
    public void onPageFinished(WebView view, String url) {
    d.dismiss();
    super.onPageFinished(view, url);
    }
    });

    回覆刪除
  22. 很感謝你的提供 我原本寫的方式太複雜了,這種方式好用很多!!!
    想請問一下 我隱藏TITLE後 tab的高度涵蓋了原本title的位置,有辦法讓他往上移,高度不要被拉大變形嗎?我動她的height都沒有改善 !!

    回覆刪除

張貼留言

這個網誌中的熱門文章

[Android] layout_weight的妙用-讓View的大小以百分比率顯示(proportionate size)

[Android] 內部儲存體(Internal Storage)的檔案系統讀寫(File I/O)

【海外婚紗】造型篇-我的超人新祕Sunny-Yang