2011年8月4日 星期四 | By: 雞米

[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動態調整,程式設計者可以針對自己的需要來選用適合的方法。

22 意見:

小崔 提到...

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

雞米 提到...

請問你遇到怎樣的問題?

小崔 提到...
作者已經移除這則留言。
雞米 提到...

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

小崔 提到...

謝謝,我會再多試試。

雞米 提到...

不客氣,有問題歡迎一起交流~

小崔 提到...

您好
Tab view我已經試成功了!!!
謝謝您的提點 m(_ _)m

MRB 提到...

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

雞米 提到...

會不會是你的tab Activity沒有透過setContentView指定其Layout,或是其layout的xml檔沒有寫好

Unknown 提到...

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

雞米 提到...

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

yatin1116 提到...

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

雞米 提到...

你是透過什麼設定讓View的orientation固定為直式?

yatin1116 提到...

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

雞米 提到...

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

yatin1116 提到...

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

yatin1116 提到...

錯誤: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);
}
});

雞米 提到...

To Yatin:

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

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

yatin1116 提到...

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

雞米 提到...

可能妳要提供完整相關的程式碼才可能知道問題在哪

yatin1116 提到...

錯誤: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);
}
});

Liar 提到...

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

張貼留言