[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)。
2. 將tab加入TabHost,並以setContent(Intent intent)將Activity與Tab產生連結,當使用者點選TabWidget上的Tabs時,便會以setContent所代入的Intent參數,將TabContentView導向intent的目標Activity。
將不同tab內容以個別的Activity呈現,對於要用tab呈現較複雜功能的Application是可以優先採用的作法,如果將許多複雜且大量的tab呈現邏輯全部放在同一個Activity,將造成維護上很大的困難,日後要進行功能擴充更動也不容易,還可以運用Activity Life Cycle來針對程式目前現況來進行tab view動態調整,程式設計者可以針對自己的需要來選用適合的方法。
不同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動態調整,程式設計者可以針對自己的需要來選用適合的方法。
您好,可否向您請教關於android的撰寫相關問題?
回覆刪除我現在日本鄉下的專門學校讀書,
學期作業要交一個android的app作品。
因為課堂上學的很有限,
住在鄉下要買相關書籍不易,
且因為日文能力不足,
所以實在是一個頭兩個大
雖然看了您的文較為瞭解了
但仍是做不出tab
是否可以教我~~~ please!!
請問你遇到怎樣的問題?
回覆刪除作者已經移除這則留言。
回覆刪除其實你遇到的都是小問題,包含了android xml檔案的命名規則、r.id的用法以及import package…等,其實IDE下面的錯誤訊息都蠻清楚的,建議你可以自己試著找出問題,這樣可以獲得更多
回覆刪除謝謝,我會再多試試。
回覆刪除不客氣,有問題歡迎一起交流~
回覆刪除您好
回覆刪除Tab view我已經試成功了!!!
謝謝您的提點 m(_ _)m
您好~請問一下!!為什麼我的Activity內容跑不出來!
回覆刪除我用的是方法三~tab跑的出來,也可以按,就是activity裡面沒有內容!
會不會是你的tab Activity沒有透過setContentView指定其Layout,或是其layout的xml檔沒有寫好
回覆刪除不好意思,請問方法三中~main.layout是否需要額外設計呢?
回覆刪除就是在eclipse中將tabhost給拉進去
謝謝
其實如果是預設的Tab View Layout
回覆刪除是不用透過setContentView()來指定Layout
系統會自動幫你設定預設layout
除非要使用包含tab view的客制外觀
詳細可以看我的文章:
http://jimmy319.blogspot.com/2012/02/android-androididid-idtabactiviry.html
請問我在網頁A是ListView 選了某一項後跳到網頁B,而網頁B就是用此方法做出的tabHost,但是網頁B一直都為橫式,我在AndroidManifest.xml設定永遠直式,在CreateTab 這頁也有設定直式,還是沒動靜><
回覆刪除你是透過什麼設定讓View的orientation固定為直式?
回覆刪除已經解決了!我又有一個新問題><我參考此方法產生TabHost,想在Tab1預設就開啟網頁,我是在Tab1.class裡onCreate 就load一個網頁至WebView,並加入onPageStarted有載入中的message,onPageFinished時關閉,但會出現 leaked window 問題,搜尋網路解法 加入OnDestroy()也相同錯誤,不知道是我加錯地方還是哪出錯?!
回覆刪除你有完整的錯誤log嗎?不過就你提到的錯誤關鍵字與你有popup載入中的message,我猜可能是你在沒關掉popup dialog的情形下,就把activity finish了
回覆刪除還有一個問題><
回覆刪除請問tab1如何丟參數給CreateTab ,且通知Create
Tab裡有一個Textview要更新為收到的參數?
錯誤: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的命名規則
我用(TextView)parentActivity.findViewById 能抓到了!!但popup dialog解決不了><你有看到我貼的錯誤碼嗎?
回覆刪除可能妳要提供完整相關的程式碼才可能知道問題在哪
回覆刪除錯誤: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);
}
});
很感謝你的提供 我原本寫的方式太複雜了,這種方式好用很多!!!
回覆刪除想請問一下 我隱藏TITLE後 tab的高度涵蓋了原本title的位置,有辦法讓他往上移,高度不要被拉大變形嗎?我動她的height都沒有改善 !!