Android TabHost中切換、修改需要显示的Activity
上個(gè)星期跟盛哥試了一段時(shí)間使用Fragment後還是不得其門而入(兩個(gè)人對(duì)Fragment都還不太熟悉),卡住的原因是現(xiàn)在有兩個(gè)Tab,當(dāng)Tab1進(jìn)入到第二個(gè)畫面,Tab2進(jìn)到第三個(gè)畫面,但使用者切回Tab1的時(shí)候,Tab1的狀態(tài)無法被保留(第二畫面),這個(gè)影響就是如果使用者透過Tab1已經(jīng)搜尋到想要的資料後,因?yàn)槟承┰蚯械絋ab2,這時(shí)候想點(diǎn)回Tab1時(shí),資料卻已經(jīng)消失,這對(duì)使用者體驗(yàn)來說是非常差的。
前天看到盛哥留言已經(jīng)解決了上述問題,而在看到盛哥解決之前,小蛙也在
Android: TabActivity Nested Activities @ Henrik Larsen Toft、
Android : How to have multiple activities under a single tab of TabActivity @ GammaPoint
這兩篇文章中找到曙光,要讓Activity彼此切換,在這邊使用到了ActivityGroup去管理各個(gè)Activity切換的動(dòng)作,並且額外設(shè)置了一個(gè)ArrayList<View> history當(dāng)作Back Stack來使用。但小蛙照著做卻還是沒辦法使用,所以修改了一些東西。
做法從上圖可以看得出來(也有可能畫得太爛造成大家看不太懂),首先小蛙在MainActivity中建立了3個(gè)Tab,分別是Tab1、Tab2、Tab3,而Tab1中會(huì)有兩次切換Activity的動(dòng)作(既然是兩次為什麼會(huì)有3個(gè)Activity?等等後面小蛙會(huì)說明),以此類推Tab2也相同,Tab3則是很單純的直接顯示一個(gè)Activity7。
會(huì)使用到同一頁籤中切換Activity的所有Activity都必須透過ActivityGroup來做管理,也就是圖中的Activity1、Activity2、Activity3都是可以透過ActivityGroup1來管理,同理可說明ActivityGroup2,每個(gè)ActivityGroup又另外設(shè)置了個(gè)別的Back Stack來管理當(dāng)使用者按下Back鍵時(shí)的行為(例如:該退出程式還是回到上一個(gè)Activity、切換Tab時(shí)該Tab原本停留的狀態(tài)),至於Activity7因?yàn)橹挥袉我豁撁嫠圆恍枰@麼麻煩。介紹完架構(gòu)家族之後,進(jìn)到程式碼的部份。
承上篇文章Android TabHost Without TabActivity,在MainActivity中的TabHost加入頁籤。
小蛙在測(cè)試了上面兩篇文章的方法後發(fā)現(xiàn),必須要在ActivityGroup1中直接先載入Activity1(也就是ActivityGroup僅用來”操作”這些Activity,並沒有實(shí)質(zhì)的內(nèi)容呈現(xiàn),如果讓ActivityGroup在這邊有自己的內(nèi)容呈現(xiàn),會(huì)造成Back Stack運(yùn)作錯(cuò)誤,也有可能是小蛙實(shí)作上出了問題,如果照著上面兩篇文章試不出來的網(wǎng)友,不妨參照小蛙的做法),以下是ActivityGroup1的程式碼: public class ActivityGroup1 extends ActivityGroup{/** 設(shè)定成 static 讓其他的子 Activity 可以存取 */public static ActivityGroup1 group;/** Back Stack */private ArrayList<View> history;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.history = new ArrayList<View>();group = this;// ActivityGroup1 只是一個(gè)外框,在這個(gè)外框中載入其他要用的 Activity// 如果沒有這個(gè)外框會(huì)發(fā)生錯(cuò)誤View view = getLocalActivityManager().startActivity("Activity1",new Intent(ActivityGroup1.this, Activity1.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();// 馬上載入真正要執(zhí)行的 ActivityreplaceView(view);}/*** 在 ActivityGroup 中切換 Activity* @param v*/public void replaceView(View v) {// 可在這插入換頁動(dòng)畫history.add(v);setContentView(v);}/*** 當(dāng)使用者按下 back 的時(shí)候,把之前存起來的 stack 撈回來顯示*/public void back() {// 原本的範(fàn)例是寫 > 0,但會(huì)發(fā)生錯(cuò)誤if(history.size() > 1) {history.remove(history.size()-1);View v = history.get(history.size()-1);// 可在這插入換頁動(dòng)畫setContentView(v);}else {// back stack 沒有其他頁面可顯示,直接結(jié)束finish();}}/*** 複寫聆聽按下 back 事件,呼叫 back()*/// 由於我的股票精算師是使用1.6+,因此採(cǎi)用onKeyDown來監(jiān)聽@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_BACK:back();break;}return true;} }
至於在Activity1中的設(shè)定如下: public class Activity1 extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity1);Button button = (Button) findViewById(R.id.button1);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 如果沒有這個(gè)外框會(huì)發(fā)生錯(cuò)誤View view = ActivityGroup1.group.getLocalActivityManager().startActivity("Activity2", new Intent(Activity1.this, Activity2.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();// 載入真正要執(zhí)行的 ActivityActivityGroup1.group.replaceView(view);}}); }
基本上到這邊就已經(jīng)可以正常運(yùn)作囉!有什麼問題可以留言在這邊,小蛙會(huì)盡可能的協(xié)助解決。
2013-01-30 有網(wǎng)友反應(yīng) MediaFire 的檔案無法下載,更新下載路徑。範(fàn)例檔下載。
2012-10-22 範(fàn)例檔下載
轉(zhuǎn)載自:http://wazai.net/2114
轉(zhuǎn)載于:https://www.cnblogs.com/xieyuan/p/3787397.html
總結(jié)
以上是生活随笔為你收集整理的Android TabHost中切換、修改需要显示的Activity的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle EBS Color 色彩设
- 下一篇: VMware vSphere 服务器虚拟