<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ActivityGroup &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/activitygroup/feed/" rel="self" type="application/rss+xml" />
	<link>https://noter.tw</link>
	<description>一路上踩到的坑、遇到的問題，一點一滴記下來，希望能幫助到需要的人~</description>
	<lastBuildDate>Mon, 13 Mar 2023 14:29:34 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.3</generator>

<image>
	<url>https://noter.tw/wp-content/uploads/cropped-old-1130742_1920-1-32x32.jpg</url>
	<title>ActivityGroup &#8211; 記下來</title>
	<link>https://noter.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Android TabHost中切換Activity</title>
		<link>https://noter.tw/2114/android-tabhost%e4%b8%ad%e5%88%87%e6%8f%9bactivity/</link>
					<comments>https://noter.tw/2114/android-tabhost%e4%b8%ad%e5%88%87%e6%8f%9bactivity/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Sat, 25 Feb 2012 07:03:29 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[back stack]]></category>
		<category><![CDATA[切換activity]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[TabHost]]></category>
		<category><![CDATA[Activity]]></category>
		<category><![CDATA[ActivityGroup]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2114</guid>

					<description><![CDATA[<p>(2013-04-15 更新)上一篇文章 Android TabHost Without TabActivity 提到如何以 Activity 取代過期的 TabActivity 來操作 TabHos&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2114/android-tabhost%e4%b8%ad%e5%88%87%e6%8f%9bactivity/" data-wpel-link="internal">Android TabHost中切換Activity</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>(2013-04-15 更新)上一篇文章 <a href="https://noter.tw/2109/android-tabhost-without-tabactivity/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal"><strong>Android TabHost Without TabActivity</strong></a> 提到如何以 Activity 取代過期的 TabActivity 來操作 TabHost，官方文件中建議以 Fragment 取代 TabActivity，但小蛙還沒試出來使用 Fragment 的方式(同事盛哥那邊有試出來，之後徵詢盛哥同意後再把 Fragment 的做法分享出來)，小蛙在這邊記錄<strong>使用 Activity + TabHost + 頁籤中切換 Activity，並且保存各個頁籤的Back Stack</strong>。注意：<strong>官方建議使用 Fragment，除非是想跟小蛙一樣懶惰到不想動到整體架構，想要進行「最少修改」，還是聽從官方建議使用 Fragment 比較好喔！</strong></p>



<span id="more-2114"></span>



<p>上個星期跟盛哥試了一段時間使用 Fragment 後還是不得其門而入(兩個人對 Fragment 都還不太熟悉)，卡住的原因是現在有兩個 Tab，當 Tab1 進入到第二個畫面，Tab2 進到第三個畫面，但使用者切回 Tab1 的時候，Tab1 的狀態無法被保留(第二畫面)，這個影響就是如果使用者透過 Tab1 已經搜尋到想要的資料後，因為某些原因切到 Tab2，這時候想點回 Tab1 時，資料卻已經消失，這對<strong>使用者體驗</strong>來說是非常差的。</p>



<p>前天看到盛哥留言已經解決了上述問題，而在看到盛哥解決之前，小蛙也在<br><a href="http://web.archive.org/web/20100816175634/http://blog.henriklarsentoft.com/2010/07/android-tabactivity-nested-activities/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>Android: TabActivity Nested Activities @ Henrik Larsen Toft</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a>、<br><strong>Android : How to have multiple activities under a single tab of TabActivity @ GammaPoint</strong><br>這兩篇文章中找到曙光，要讓Activity彼此切換，在這邊使用到了 <strong>ActivityGroup </strong>去管理各個 Activity 切換的動作，並且額外設置了一個 <strong>ArrayList&lt;View> history </strong>當作 <strong>Back Stack </strong>來使用。但小蛙照著做卻還是沒辦法使用，所以修改了一些東西。</p>



<p class="has-text-align-center"><img fetchpriority="high" decoding="async" width="392" height="353" src="https://lh5.googleusercontent.com/-oBDLDoyZ5yk/T0iAADc8TNI/AAAAAAAAEMc/ocNlEoroHZA/s800/TabHost.jpg" alt="TabHost Android TabHost中切換Activity" title="Android TabHost中切換Activity"></p>



<p>做法從上圖可以看得出來(也有可能畫得太爛造成大家看不太懂)，首先小蛙在 MainActivity 中建立了 3 個 Tab，分別是 Tab1、Tab2、Tab3，而 Tab1 中會有兩次切換 Activity 的動作(既然是兩次為什麼會有 3 個 Activity？等等後面小蛙會說明)，以此類推 Tab2 也相同，Tab3 則是很單純的直接顯示一個 Activity7。</p>



<p>會使用到同一頁籤中切換 Activity 的所有 Activity 都必須透過 ActivityGroup 來做管理，也就是圖中的 Activity1、Activity2、Activity3 都是可以透過 ActivityGroup1 來管理，同理可說明 ActivityGroup2，每個 ActivityGroup 又另外設置了個別的 <strong>Back Stack </strong>來管理當使用者按下 Back 鍵時的行為 (例如：該退出程式還是回到上一個 Activity、切換 Tab 時該 Tab 原本停留的狀態)，至於 Activity7 因為只有單一頁面所以不需要這麼麻煩。介紹完架構家族之後，進到程式碼的部份。</p>



<p>承上篇文章 <a href="https://noter.tw/2109/android-tabhost-without-tabactivity/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal"><strong>Android TabHost Without TabActivity</strong></a>，在 MainActivity 中的 TabHost 加入頁籤。</p>



<pre class="wp-block-preformatted withcode">mHost.addTab(mHost.newTabSpec(getString(R.string.tab_two_name))
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setIndicator(getString(R.string.tab_two_name))
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setContent(new Intent(this, ActivityGroup1.class)));</pre>



<p>小蛙在測試了上面兩篇文章的方法後發現，必須要在 ActivityGroup1 中直接先載入 Activity1 (也就是 ActivityGroup 僅用來&#8221;操作&#8221;這些 Activity，並沒有實質的內容呈現，如果讓 ActivityGroup 在這邊有自己的內容呈現，會造成 Back Stack 運作錯誤，也有可能是小蛙實作上出了問題，如果照著上面兩篇文章試不出來的網友，不妨參照小蛙的做法)，以下是 ActivityGroup1 的程式碼：</p>



<pre class="wp-block-preformatted withcode">public class ActivityGroup1 extends ActivityGroup{
 &nbsp;&nbsp;&nbsp;&nbsp;/** 設定成 static 讓其他的子 Activity 可以存取 <em>/ &nbsp;&nbsp;&nbsp;&nbsp;public static ActivityGroup1 group; &nbsp;&nbsp;&nbsp;&nbsp;/</em>* Back Stack <em>/ &nbsp;&nbsp;&nbsp;&nbsp;private ArrayList history; &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public void onCreate(Bundle savedInstanceState) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.onCreate(savedInstanceState); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.history = new ArrayList(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group = this; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// ActivityGroup1 只是一個外框，在這個外框中載入其他要用的 Activity &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 如果沒有這個外框會發生錯誤 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View view = getLocalActivityManager() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.startActivity("Activity1", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Intent(ActivityGroup1.this, Activity1.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getDecorView(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 馬上載入真正要執行的 Activity &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replaceView(view); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/</em>*
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 在 ActivityGroup 中切換 Activity
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param v
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>/ &nbsp;&nbsp;&nbsp;&nbsp;public void replaceView(View v) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 可在這插入換頁動畫 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;history.add(v); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setContentView(v); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/</em>*
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 當使用者按下 back 的時候，把之前存起來的 stack 撈回來顯示
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>/ &nbsp;&nbsp;&nbsp;&nbsp;public void back() { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 原本的範例是寫 &gt; 0，但會發生錯誤 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(history.size() &gt; 1) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;history.remove(history.size()-1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View v = history.get(history.size()-1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 可在這插入換頁動畫 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setContentView(v); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// back stack 沒有其他頁面可顯示，直接結束 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finish(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/</em>*
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 複寫聆聽按下 back 事件，呼叫 back()
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
 &nbsp;&nbsp;&nbsp;&nbsp;// 由於我的股票精算師是使用1.6+，因此採用onKeyDown來監聽
 &nbsp;&nbsp;&nbsp;&nbsp;@Override
 &nbsp;&nbsp;&nbsp;&nbsp;public boolean onKeyDown(int keyCode, KeyEvent event) {
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (keyCode) {
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case KeyEvent.KEYCODE_BACK:
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;back();
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;
 &nbsp;&nbsp;&nbsp;&nbsp;}
 }</pre>



<p>至於在Activity1中的設定如下：</p>



<pre class="wp-block-preformatted withcode">public class Activity1 extends Activity{
 &nbsp;&nbsp;&nbsp;&nbsp;@Override
 &nbsp;&nbsp;&nbsp;&nbsp;protected void onCreate(Bundle savedInstanceState) {
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.onCreate(savedInstanceState);
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setContentView(R.layout.activity1);
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button button = (Button) findViewById(R.id.button1);
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button.setOnClickListener(new View.OnClickListener() {
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void onClick(View v) {
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 如果沒有這個外框會發生錯誤
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View view = ActivityGroup1.group.getLocalActivityManager().startActivity("Activity2", new Intent(Activity1.this, Activity2.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 載入真正要執行的 Activity
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActivityGroup1.group.replaceView(view);
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});
 }</pre>



<p>基本上到這邊就已經可以正常運作囉！有什麼問題可以留言在這邊，小蛙會盡可能的協助解決。</p>



<p>2013-01-30 有網友反應 MediaFire 的檔案無法下載，更新下載路徑。<a href="https://noter.tw/dn/Tab.rar" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">範例檔下載</a>。</p>



<p>2012-10-22 <a href="http://www.mediafire.com/?g2o51eb4brke8r7" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">範例檔下載<span class="wpel-icon wpel-image wpel-icon-6"></span></a></p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2114/android-tabhost%e4%b8%ad%e5%88%87%e6%8f%9bactivity/" data-wpel-link="internal">Android TabHost中切換Activity</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2114/android-tabhost%e4%b8%ad%e5%88%87%e6%8f%9bactivity/feed/</wfw:commentRss>
			<slash:comments>44</slash:comments>
		
		
			</item>
	</channel>
</rss>
