<?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>TabHost &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/tabhost/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>TabHost &#8211; 記下來</title>
	<link>https://noter.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Android Tabhost with FragmentActivity</title>
		<link>https://noter.tw/2125/android-tabhost-with-fragmentactivity/</link>
					<comments>https://noter.tw/2125/android-tabhost-with-fragmentactivity/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 29 Feb 2012 15:26:55 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[TabHost]]></category>
		<category><![CDATA[onConfigurationChanged]]></category>
		<category><![CDATA[screenOrientation]]></category>
		<category><![CDATA[Fragment]]></category>
		<category><![CDATA[FragmentActivity]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2125</guid>

					<description><![CDATA[<p>(2013-01-30 更新) 接續 Android TabHost中切換Activity 記錄了使用 ActivityGroup 達到在 TabHost 中切換 Activity 的方法，也在 An&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2125/android-tabhost-with-fragmentactivity/" data-wpel-link="internal">Android Tabhost with FragmentActivity</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>(2013-01-30 更新) 接續 <a href="https://noter.tw/2114/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal"><strong>Android TabHost中切換Activity</strong></a> 記錄了使用 <strong>ActivityGroup 達到在 TabHost 中切換 Activity </strong>的方法，也在 <a href="https://noter.tw/2120/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal"><strong>Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle</strong></a> 記錄了當螢幕方向改變時的處理，這篇小蛙繼續記錄<strong>用 FragmentActivity 取代 ActivityGroup</strong>，透過 <strong><span style="color: #ff0000;">FragmentActivity </span></strong>內建的 <strong>BackStack </strong>來管理倒退歷程。<br />
<span id="more-2125"></span>這個程式碼小蛙很早之前就實作完成，但礙於螢幕方向改變時的處理一直還找不到解決辦法，所以一直拖到現在，不囉嗦直接進程式碼。<br />
<strong>MainTabActivity.java</strong> : 主要的 Tabhost Activity。</p>
<div>
<div id="highlighter_925885" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">MainTabActivity </code><code class="java keyword">extends</code> <code class="java plain">Activity {</code></div>
<div class="line number2 index1 alt1"><code class="java spaces">    </code><code class="java keyword">private</code> <code class="java plain">TabHost mHost;</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">    </code><code class="java comments">// 在Activity中使用Tabhost必須要有LocalActivityManager物件來設定</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">    </code><code class="java plain">LocalActivityManager lam;</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">    </code><code class="java color1">@Override</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">    </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">onCreate(Bundle savedInstanceState) {</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">        </code><code class="java keyword">super</code><code class="java plain">.onCreate(savedInstanceState);</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">        </code><code class="java plain">setContentView(R.layout.main);</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">        </code><code class="java comments">// main layout採用預設的Tabhost</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">        </code><code class="java plain">mHost = (TabHost) findViewById(android.R.id.tabhost);</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">        </code><code class="java plain">lam = </code><code class="java keyword">new</code> <code class="java plain">LocalActivityManager(MainTabActivity.</code><code class="java keyword">this</code><code class="java plain">, </code><code class="java keyword">false</code><code class="java plain">);</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">        </code><code class="java plain">lam.dispatchCreate(savedInstanceState);</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">        </code><code class="java plain">mHost.setup(lam);</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">        </code><code class="java plain">mHost.addTab(mHost.newTabSpec(</code><code class="java string">"Tab1"</code><code class="java plain">).setIndicator(</code><code class="java string">"Tab1"</code><code class="java plain">).setContent(</code><code class="java keyword">new</code> <code class="java plain">Intent(MainTabActivity.</code><code class="java keyword">this</code><code class="java plain">, FragmentActivity1.</code><code class="java keyword">class</code><code class="java plain">)));</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">        </code><code class="java plain">mHost.addTab(mHost.newTabSpec(</code><code class="java string">"Tab2"</code><code class="java plain">).setIndicator(</code><code class="java string">"Tab2"</code><code class="java plain">).setContent(</code><code class="java keyword">new</code> <code class="java plain">Intent(MainTabActivity.</code><code class="java keyword">this</code><code class="java plain">, FragmentActivity2.</code><code class="java keyword">class</code><code class="java plain">)));</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">    </code><code class="java plain">}</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">    </code><code class="java color1">@Override</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">    </code><code class="java keyword">protected</code> <code class="java keyword">void</code> <code class="java plain">onPause() {</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">        </code><code class="java comments">// 漏掉這行一定出錯</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">        </code><code class="java plain">lam.dispatchPause(isFinishing());</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">        </code><code class="java keyword">super</code><code class="java plain">.onPause();</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">    </code><code class="java plain">}</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">    </code><code class="java color1">@Override</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">    </code><code class="java keyword">protected</code> <code class="java keyword">void</code> <code class="java plain">onResume() {</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">        </code><code class="java comments">// 漏掉這行一定出錯</code></div>
<div class="line number26 index25 alt1"><code class="java spaces">        </code><code class="java plain">lam.dispatchResume();</code></div>
<div class="line number27 index26 alt2"><code class="java spaces">        </code><code class="java keyword">super</code><code class="java plain">.onResume();</code></div>
<div class="line number28 index27 alt1"><code class="java spaces">    </code><code class="java plain">}</code></div>
<div class="line number29 index28 alt2"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p><strong>FragmentActivity1.java</strong> : 第一個 Tab 中用來管理 Fragment 的 FragmentActivity。(2012-05-07更新) 經由 Jay 留言後，小蛙詳細測了一下，發現 FragmentActivity 主畫面中的 Button 是沒辦法消失的 (因為 FragmentActivity 的目的關係)，因此改成這樣，讓 FragmentActivity 純粹當成容器，主要的內容還是以 Fragment 為主。(這個方法不是唯一，但是一個可行的方法，應該也有更好的做法！)</p>
<div>
<div id="highlighter_622055" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">FragmentActivity1 </code><code class="java keyword">extends</code> <code class="java plain">FragmentActivity {</code></div>
<div class="line number2 index1 alt1"><code class="java spaces">    </code><code class="java keyword">public</code> <code class="java keyword">static</code> <code class="java plain">FragmentManager fm;</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">    </code><code class="java color1">@Override</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">    </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">onCreate(Bundle savedInstanceState) {</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">        </code><code class="java keyword">super</code><code class="java plain">.onCreate(savedInstanceState);</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">        </code><code class="java plain">setContentView(R.layout.fragment_activity_1);</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">        </code><code class="java plain">fm = getSupportFragmentManager();</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">        </code><code class="java comments">// 只當容器，主要內容已Fragment呈現</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">        </code><code class="java plain">initFragment(</code><code class="java keyword">new</code> <code class="java plain">Fragment1());</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">    </code><code class="java plain">}</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">    </code><code class="java comments">// 切換Fragment</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">    </code><code class="java keyword">public</code> <code class="java keyword">static</code> <code class="java keyword">void</code> <code class="java plain">changeFragment(Fragment f){</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">        </code><code class="java plain">changeFragment(f, </code><code class="java keyword">false</code><code class="java plain">);</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">    </code><code class="java plain">}</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">    </code><code class="java comments">// 初始化Fragment(FragmentActivity中呼叫)</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">    </code><code class="java keyword">public</code> <code class="java keyword">static</code> <code class="java keyword">void</code> <code class="java plain">initFragment(Fragment f){</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">        </code><code class="java plain">changeFragment(f, </code><code class="java keyword">true</code><code class="java plain">);</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">    </code><code class="java plain">}</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">    </code><code class="java keyword">private</code> <code class="java keyword">static</code> <code class="java keyword">void</code> <code class="java plain">changeFragment(Fragment f, </code><code class="java keyword">boolean</code> <code class="java plain">init){</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">        </code><code class="java plain">FragmentTransaction ft = fm.beginTransaction();</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">        </code><code class="java plain">ft.replace(R.id.simple_fragment, f);</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">        </code><code class="java keyword">if</code><code class="java plain">(!init)</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">            </code><code class="java plain">ft.addToBackStack(</code><code class="java keyword">null</code><code class="java plain">);</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">        </code><code class="java plain">ft.commit();</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">    </code><code class="java plain">}</code></div>
<div class="line number26 index25 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p><strong>Fragment1.java</strong> : 真正使用到的 Fragment。</p>
<div>
<div id="highlighter_71265" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">Fragment1 </code><code class="java keyword">extends</code> <code class="java plain">Fragment {</code></div>
<div class="line number2 index1 alt1"><code class="java spaces">    </code><code class="java color1">@Override</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">    </code><code class="java keyword">public</code> <code class="java plain">View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">        </code><code class="java plain">View v = inflater.inflate(R.layout.fragment_1, container, </code><code class="java keyword">false</code><code class="java plain">);</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">        </code><code class="java plain">Button tv = (Button)v.findViewById(R.id.button2);</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">        </code><code class="java plain">tv.setOnClickListener(</code><code class="java keyword">new</code> <code class="java plain">View.OnClickListener() {</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">            </code><code class="java color1">@Override</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">            </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">onClick(View v) {</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">                </code><code class="java comments">// 直接呼叫FragmentActivity1的靜態方法來做切換</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">                </code><code class="java plain">FragmentActivity1.changeFragment(</code><code class="java keyword">new</code> <code class="java plain">Fragment2());</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">            </code><code class="java plain">}</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">        </code><code class="java plain">});</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">        </code><code class="java keyword">return</code> <code class="java plain">v;</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">    </code><code class="java plain">}</code></div>
<div class="line number15 index14 alt2"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p><strong>fragment_acitivity_1.xml</strong> : FragmentActivity layout。(2012-05-07修改) FragmentActivity 只用來當容器，而不真正呈現內容 (僅把 Fragment 內容載入)。</p>
<div>
<div id="highlighter_180717" class="syntaxhighlighter  xml">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="xml plain">&lt;?</code><code class="xml keyword">xml</code> <code class="xml color1">version</code><code class="xml plain">=</code><code class="xml string">"1.0"</code> <code class="xml color1">encoding</code><code class="xml plain">=</code><code class="xml string">"utf-8"</code><code class="xml plain">?&gt;</code></div>
<div class="line number2 index1 alt1"><code class="xml plain">&lt;</code><code class="xml keyword">LinearLayout</code> <code class="xml color1">xmlns:android</code><code class="xml plain">=</code><code class="xml string">"<a href="http://schemas.android.com/apk/res/android" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">http://schemas.android.com/apk/res/android<span class="wpel-icon wpel-image wpel-icon-6"></span></a>"</code></div>
<div class="line number3 index2 alt2"><code class="xml spaces">    </code><code class="xml color1">android:layout_width</code><code class="xml plain">=</code><code class="xml string">"fill_parent"</code></div>
<div class="line number4 index3 alt1"><code class="xml spaces">    </code><code class="xml color1">android:layout_height</code><code class="xml plain">=</code><code class="xml string">"fill_parent"</code></div>
<div class="line number5 index4 alt2"><code class="xml spaces">    </code><code class="xml color1">android:orientation</code><code class="xml plain">=</code><code class="xml string">"vertical"</code></div>
<div class="line number6 index5 alt1"><code class="xml spaces">    </code><code class="xml color1">android:id</code><code class="xml plain">=</code><code class="xml string">"@+id/simple_fragment"</code><code class="xml plain">&gt;</code></div>
<div class="line number7 index6 alt2"><code class="xml plain">&lt;/</code><code class="xml keyword">LinearLayout</code><code class="xml plain">&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p><strong>fragment1.xml</strong>：Fragment layout，FragmentActivity 載入的真正內容。</p>
<div>
<div id="highlighter_788838" class="syntaxhighlighter  actionscript3">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="actionscript3 plain">&lt;?xml version=</code><code class="actionscript3 string">"1.0"</code> <code class="actionscript3 plain">encoding=</code><code class="actionscript3 string">"utf-8"</code><code class="actionscript3 plain">?&gt;</code></div>
<div class="line number2 index1 alt1"><code class="actionscript3 plain">&lt;LinearLayout xmlns:android=</code><code class="actionscript3 string">"<a href="http://schemas.android.com/apk/res/android" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">http://schemas.android.com/apk/res/android<span class="wpel-icon wpel-image wpel-icon-6"></span></a>"</code></div>
<div class="line number3 index2 alt2"><code class="actionscript3 spaces">    </code><code class="actionscript3 plain">android:layout_width=</code><code class="actionscript3 string">"fill_parent"</code></div>
<div class="line number4 index3 alt1"><code class="actionscript3 spaces">    </code><code class="actionscript3 plain">android:layout_height=</code><code class="actionscript3 string">"fill_parent"</code></div>
<div class="line number5 index4 alt2"><code class="actionscript3 spaces">    </code><code class="actionscript3 plain">android:orientation=</code><code class="actionscript3 string">"vertical"</code><code class="actionscript3 plain">&gt;</code></div>
<div class="line number6 index5 alt1"><code class="actionscript3 spaces">    </code><code class="actionscript3 plain">&lt;Button</code></div>
<div class="line number7 index6 alt2"><code class="actionscript3 spaces">        </code><code class="actionscript3 plain">android:id=</code><code class="actionscript3 string">"@+id/button2"</code></div>
<div class="line number8 index7 alt1"><code class="actionscript3 spaces">        </code><code class="actionscript3 plain">android:layout_width=</code><code class="actionscript3 string">"wrap_content"</code></div>
<div class="line number9 index8 alt2"><code class="actionscript3 spaces">        </code><code class="actionscript3 plain">android:layout_height=</code><code class="actionscript3 string">"wrap_content"</code></div>
<div class="line number10 index9 alt1"><code class="actionscript3 spaces">        </code><code class="actionscript3 plain">android:text=</code><code class="actionscript3 string">"Button"</code> <code class="actionscript3 plain">/&gt;</code></div>
<div class="line number11 index10 alt2"><code class="actionscript3 plain">&lt;/LinearLayout&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>最後別忘了在 AndroidManifest.xml 中加入<strong>android:configChanges=&#8221;orientation&#8221; </strong>設定。這樣就成功的使用<strong><span style="color: #ff0000;">在 Activity 中使用 Tabhost並且透過 FragmentActivity 來管理 Fragment </span></strong>囉！</p>
<p>2013-01-30 許多網友反應無法下載 MediaFire 的檔案，補上新連結。<a href="https://noter.tw/dn/Fragment.rar" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">範例檔下載</a>。</p>
<p>2012-10-22 <a href="http://www.mediafire.com/?5z0azaqi46kng06" target="_blank" rel="noopener noreferrer 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/2125/android-tabhost-with-fragmentactivity/" data-wpel-link="internal">Android Tabhost with FragmentActivity</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2125/android-tabhost-with-fragmentactivity/feed/</wfw:commentRss>
			<slash:comments>21</slash:comments>
		
		
			</item>
		<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>
		<item>
		<title>Android TabHost Without TabActivity</title>
		<link>https://noter.tw/2109/android-tabhost-without-tabactivity/</link>
					<comments>https://noter.tw/2109/android-tabhost-without-tabactivity/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Sat, 25 Feb 2012 05:47:50 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[java.lang.IllegalStateException]]></category>
		<category><![CDATA[TabActivity]]></category>
		<category><![CDATA[TabHost]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2109</guid>

					<description><![CDATA[<p>頁籤(TabHost)在行動APP中扮演了很重要的角色，由於手機的畫面比較小，因此如果有很多功能需要提供給使用者，不太可能全部擠在同一個頁面，因此頁籤功能可以讓使用者有比較好的體驗，讓使用者操作起來就&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2109/android-tabhost-without-tabactivity/" data-wpel-link="internal">Android TabHost Without TabActivity</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p><strong><span style="color: #ff0000;">頁籤(TabHost)</span></strong>在行動APP中扮演了很重要的角色，由於手機的畫面比較小，因此如果有很多功能需要提供給使用者，不太可能全部擠在同一個頁面，因此頁籤功能可以讓使用者有比較好的體驗，讓使用者操作起來就像在「同一個頁面」，要切換功能也比較方便。但Google <strong>TabHost</strong>找到的範例大多是使用<span style="color: #ff0000;"><strong>TabActivity</strong></span>來操作TabHost，而<a href="http://developer.android.com/reference/android/app/TabActivity.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">官網<span class="wpel-icon wpel-image wpel-icon-6"></span></a>已經明確的指出<strong>TabActivity這個類別已經過期</strong>(deprecated)。<br />
<span id="more-2109"></span></p>
<blockquote><p><strong>This class is deprecated.</strong><br />
New applications should use Fragments instead of this class; to continue to run on older devices, you can use the v4 support library which provides a version of the Fragment API that is compatible down to <code><a href="http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#DONUT" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">DONUT<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code>.</p></blockquote>
<p>照著上面官網所提到的可以透過<span style="color: #ff0000;"><strong>Fragments</strong></span>來取代TabActivity的功能。<br />
為了避免「<strong>我的股票精算師</strong>」往後也會面臨到這種困擾，小蛙開始找有沒有替代方案，既然過期的是TabActivity，TabActivity是繼承<strong>ActivityGroup</strong>，而ActivityGroup又是繼承<strong>Activity</strong>，那應該有可能將TabHost放置在Activity中吧？Google上發現的確有高手分享相關文章，小蛙就以「最少修改」的方式進行「<strong>我的股票精算師</strong>」修改，其實把TabActivity用Activity取代並不難，但是不知道從何修改起，也不知道問題到底在哪，從官方的TabActivity原始碼中應該可以看出一些端倪，看來要增進自己的能力還是必須要<strong>多看官方原始碼</strong>才行。<br />
不廢話了，直接進程式碼吧！TabHost的使用方法小蛙就不再另外說明了，Google一下就有很多。這裡直接說明要修改的部分。小蛙參考了<strong><a href="http://stackoverflow.com/questions/3163884/android-tabhost-without-tabactivity" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Stack Overflow這篇文章<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong>，建立TabHost的方始與使用TabActivity時完全相同，要修改部分如下(<strong><span style="color: #ff0000;">上面是原始版本，下面是修改過後的版本</span></strong>)：<br />
1. 把TabActivity改成Activity(廢話 &#8230;)</p>
<pre class="brush: java; gutter: false">public class MainActivity extends TabActivity</pre>
<pre class="brush: java; gutter: false">public class MainActivity extends Activity</pre>
<p>2. 取得TabHost物件，這裡不能透過像TabActivity一樣直接用getTabHost();。</p>
<pre class="brush: java; gutter: false">TabHost tabHost = getTabHost();</pre>
<pre class="brush: java; gutter: false">TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);</pre>
<p>3. 增加一個LocalActivityManager物件。這幾行是一定不能少，少了<span style="text-decoration: line-through;">對大家都不好</span>DDMS會一直報出大量的錯誤訊息。</p>
<pre class="brush: java; gutter: true">LocalActivityManager lam = new LocalActivityManager(MainActivity.this, false);
lam.dispatchCreate(savedInstanceState);
mHost.setup(lam);</pre>
<p>4. 最後最重要的重頭戲部份Override onPause及onResume(這個應該是有看過Source的人才知道的吧！小蛙太弱了&gt;&lt;)，少了這邊的設定，就算上面全部都對，到這邊還是會狂錯(感謝Stack Overflow的<a href="http://stackoverflow.com/users/563306/dcanh121" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>dcanh121</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a>以及<a href="http://stackoverflow.com/users/927471/cj-villa" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>CJ Villa</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a>)。</p>
<pre class="brush: java; gutter: true">@Override
protected void onPause() {
    lam.dispatchPause(isFinishing());
    super.onPause();
}
@Override
protected void onResume() {
    lam.dispatchResume();
    super.onResume();
}</pre>
<p>如果有任何一個步驟漏掉，會得到以下錯誤。</p>
<pre class="brush: text; gutter: false">Caused by: java.lang.IllegalStateException: Activities can't be added until the containing group has been created.</pre>
<p>到這邊就已經完成囉！其他tabHost.addTab的使用方式一模一樣。接下來會再另一篇說明怎麼在TabHost裡面切換多個Activity，並且讓每個頁籤中的Back Stack可以獨立運作。</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2109/android-tabhost-without-tabactivity/" data-wpel-link="internal">Android TabHost Without TabActivity</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2109/android-tabhost-without-tabactivity/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
