<?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>onConfigurationChanged &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/onconfigurationchanged/feed/" rel="self" type="application/rss+xml" />
	<link>https://noter.tw</link>
	<description>一路上踩到的坑、遇到的問題，一點一滴記下來，希望能幫助到需要的人~</description>
	<lastBuildDate>Wed, 12 Oct 2022 07:15:53 +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>onConfigurationChanged &#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 Screen Orientation Event螢幕方向處理+Acitivity Liftcycle</title>
		<link>https://noter.tw/2120/android-screen-orientation-event%e8%9e%a2%e5%b9%95%e6%96%b9%e5%90%91%e8%99%95%e7%90%86acitivity-liftcycle/</link>
					<comments>https://noter.tw/2120/android-screen-orientation-event%e8%9e%a2%e5%b9%95%e6%96%b9%e5%90%91%e8%99%95%e7%90%86acitivity-liftcycle/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 29 Feb 2012 12:30:06 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[lifecycle]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[onConfigurationChanged]]></category>
		<category><![CDATA[screenOrientation]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2120</guid>

					<description><![CDATA[<p>前幾篇文章中介紹了 使用Activity取代TabActivity 以及 透過ActivityGroup達到TabHost中切換Activity。之後會再補上使用 FragmentActivity +&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2120/android-screen-orientation-event%e8%9e%a2%e5%b9%95%e6%96%b9%e5%90%91%e8%99%95%e7%90%86acitivity-liftcycle/" data-wpel-link="internal">Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>前幾篇文章中介紹了<strong> <a href="https://noter.tw/2109" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">使用Activity取代TabActivity</a> </strong>以及<strong> <a href="https://noter.tw/2114" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">透過ActivityGroup達到TabHost中切換Activity</a></strong>。之後會再補上使用 <strong>FragmentActivity + Fragment + TabHost </strong>的作法 (Google 建議使用 Fragment)。這篇文章小蛙要記錄當使用者螢幕方向改變時的處理方式。<br />
<span id="more-2120"></span>在發表完上面兩篇文章後，小蛙馬上實作看看使用 <strong>FragmentActivity </strong>的方法，實作上面跟 <strong>ActivityGroup </strong>差不多，勝過 ActivityGroup 的部分在於有<strong>自動維護的 BackStack</strong>，不用再自行建立 ArrayList&lt;View&gt; history 來管理 BackStack。至於為什麼沒有馬上發表文章呢？是因為小蛙想要把螢幕方向這件事情一起處理掉再發表，目前的情況是這樣的：</p>
<p><a href="https://lh3.googleusercontent.com/-G5xDZcMB46k/T03qTlq7ANI/AAAAAAAAEMo/oZaTRQIRWeA/s800/orientation.PNG" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img fetchpriority="high" decoding="async" class="aligncenter" title="Android orientation" src="https://lh3.googleusercontent.com/-G5xDZcMB46k/T03qTlq7ANI/AAAAAAAAEMo/oZaTRQIRWeA/s800/orientation.PNG" alt="orientation Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle" width="611" height="284"></a></p>
<p>問題1.</p>
<p>使用者在 portrait 時切換到 Tab 2，翻轉螢幕成 landscape 時卻回到 Tab 1 (應該要停在 Tab 2)。</p>
<p>問題2.</p>
<p>軟體啟動時為 portrait(A)，使用者在 Tab 1 先後運行了 Page1-1、Page1-2、Page1-3，在 Tab2 也同樣運行了 Page2-1 ~ Page2-4，這時候使用者翻轉螢幕變成landscape(B)，BackStack 全部被清光光，使用者看到的畫面變成軟體剛啟動時的空白畫面。</p>
<p>針對問題1小蛙直接使用 <strong><a href="https://noter.tw/1892" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">onSaveInstanceState, onRestoreInstanceState使用</a> </strong>這個方法複寫了 <strong>onRestoreInstanceState </strong>及 <strong>onSaveInstanceState </strong>兩個方法。</p>
<div>
<div id="highlighter_780226" 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>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java color1">@Override</code></div>
<div class="line number2 index1 alt1"><code class="java keyword">protected</code> <code class="java keyword">void</code> <code class="java plain">onSaveInstanceState(Bundle outState) {</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">    </code><code class="java comments">// 發生翻轉動作的時候將目前頁籤儲存到Bundle中</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">    </code><code class="java plain">outState.putInt(</code><code class="java string">"which"</code><code class="java plain">, tabHost.getCurrentTab());</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">    </code><code class="java keyword">super</code><code class="java plain">.onSaveInstanceState(outState);</code></div>
<div class="line number6 index5 alt1"><code class="java plain">}</code></div>
<div class="line number7 index6 alt2"><code class="java color1">@Override</code></div>
<div class="line number8 index7 alt1"><code class="java keyword">protected</code> <code class="java keyword">void</code> <code class="java plain">onRestoreInstanceState(Bundle savedInstanceState) {</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">    </code><code class="java comments">// 把剛剛存的取出來</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">    </code><code class="java keyword">if</code><code class="java plain">(savedInstanceState != </code><code class="java keyword">null</code><code class="java plain">)</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">        </code><code class="java plain">tabHost.setCurrentTab(savedInstanceState.getInt(</code><code class="java string">"which"</code><code class="java plain">));</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">    </code><code class="java keyword">super</code><code class="java plain">.onRestoreInstanceState(savedInstanceState);</code></div>
<div class="line number13 index12 alt2"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>但是今天發現了一個新的東西叫作「<a href="http://developer.android.com/guide/topics/manifest/activity-element.html#config" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><span style="color: #ff0000;"><strong><code>android:configChanges</code></strong></span><span class="wpel-icon wpel-image wpel-icon-6"></span></a>」，這應該算是一個蠻基礎的設定，小蛙真是太失敗了&#8230;下面這個設定方法可以一併解決上述問題 1,2，也就是說上面的方法不需要用到。用小蛙簡單白話的說明就是：</p>
<blockquote><p>當使用者翻轉螢幕時，就歷經了一次舊 Activity 的死亡及新 Activity 的誕生，透過 android:configChanges 可以使得翻轉螢幕的動作不用歷經這一個過程，取而代之的是呼叫 onConfigurationChanged 方法。</p></blockquote>
<p>好吧！總而言之就是只要在 <strong>AndroidManifest.xml </strong>的 Activity 敘述中加入<strong>android:configChanges=&#8221;orientation&#8221;</strong>，如此一來，當發生螢幕翻轉事件的時候，就可以保留各個 Tab 的狀態以及 BackStack 囉！另外可以透過複寫 onConfigurationChanged 方法來做更進一步的處理。例如官方範例：</p>
<div>
<div id="highlighter_410817" 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>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java color1">@Override</code></div>
<div class="line number2 index1 alt1"><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">onConfigurationChanged(Configuration newConfig) {</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">    </code><code class="java keyword">super</code><code class="java plain">.onConfigurationChanged(newConfig);</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">    </code><code class="java comments">// Checks the orientation of the screen</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">    </code><code class="java keyword">if</code> <code class="java plain">(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">        </code><code class="java plain">Toast.makeText(</code><code class="java keyword">this</code><code class="java plain">, </code><code class="java string">"landscape"</code><code class="java plain">, Toast.LENGTH_SHORT).show();</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">    </code><code class="java plain">} </code><code class="java keyword">else</code> <code class="java keyword">if</code> <code class="java plain">(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">        </code><code class="java plain">Toast.makeText(</code><code class="java keyword">this</code><code class="java plain">, </code><code class="java string">"portrait"</code><code class="java plain">, Toast.LENGTH_SHORT).show();</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">    </code><code class="java plain">}</code></div>
<div class="line number10 index9 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>附上 Android Activity Lifecycle 圖 (圖片來源：<a href="http://developer.android.com/reference/android/app/Activity.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://developer.android.com/reference/android/app/Activity.html<span class="wpel-icon wpel-image wpel-icon-6"></span></a>)。<br />
<a href="https://lh6.googleusercontent.com/-7Pj4WcuPH_A/T03yugNy6xI/AAAAAAAAEM0/bPKsMNREUNs/s800/activity_lifecycle.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Activity Lifecycle" src="https://lh6.googleusercontent.com/-7Pj4WcuPH_A/T03yugNy6xI/AAAAAAAAEM0/bPKsMNREUNs/s800/activity_lifecycle.png" alt="activity lifecycle Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle" width="523" height="673"></a><br />
由於小蛙看到 横竖屏切换时候Activity的生命周期 @ Android开发教程 ( http://android.tgbus.com/Android/tutorial/201103/346550.shtml 連結已失效) 及 【亲测】Activity中的 ConfigChanges 属性以及横竖屏切换时候 Activity 的生命周期 @ 漫步云端 (http://www.cnblogs.com/charley_yang/archive/2011/04/17/2018940.html 連結已失效) 這兩篇文章中的 Lifecycle 感覺有點奇怪，於是自己測了一下，所得到的結果似乎不太一樣，可能是模擬器的行為跟手機的不同，也有可能是 Android 版本不同 (小蛙是用 HTC Desire + MIUI2.3 測試的，android:minSdkVersion=&#8221;4&#8243;)，以下是測試結果供參考。</p>
<div>
<div id="highlighter_492244" class="syntaxhighlighter  text">
<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>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="text plain">// 正常啟動Activity</code></div>
<div class="line number2 index1 alt1"><code class="text plain">onCreate</code></div>
<div class="line number3 index2 alt2"><code class="text plain">onStart</code></div>
<div class="line number4 index3 alt1"><code class="text plain">onResume</code></div>
<div class="line number5 index4 alt2"><code class="text plain">// 結束Activity</code></div>
<div class="line number6 index5 alt1"><code class="text plain">onPause</code></div>
<div class="line number7 index6 alt2"><code class="text plain">onStop</code></div>
<div class="line number8 index7 alt1"><code class="text plain">onDestroy</code></div>
<div class="line number9 index8 alt2"><code class="text plain">// 翻轉螢幕(直轉橫、橫轉直)</code></div>
<div class="line number10 index9 alt1"><code class="text plain">onSaveInstanceState</code></div>
<div class="line number11 index10 alt2"><code class="text plain">onPause</code></div>
<div class="line number12 index11 alt1"><code class="text plain">onStop</code></div>
<div class="line number13 index12 alt2"><code class="text plain">onDestroy</code></div>
<div class="line number14 index13 alt1"><code class="text plain">onCreate</code></div>
<div class="line number15 index14 alt2"><code class="text plain">onStart</code></div>
<div class="line number16 index15 alt1"><code class="text plain">onRestoreInstanceState</code></div>
<div class="line number17 index16 alt2"><code class="text plain">onResume</code></div>
<div class="line number18 index17 alt1"><code class="text plain">// 翻轉螢幕(直轉橫、橫轉直)</code></div>
<div class="line number19 index18 alt2"><code class="text plain">// 以及android:configChanges="orientation"</code></div>
<div class="line number20 index19 alt1"><code class="text plain">onConfigurationChanged</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>今天用模擬器測試了一下，android:configChanges=&#8221;orientation&#8221; 在模擬器上沒法正常使用，必須要改成 android:configChanges=&#8221;orientation|keyboardHidden&#8221;，有遇到問題的網友不妨試試看。</p>
<p>最後memo一下，小蛙在<a href="http://developer.android.com/guide/topics/resources/runtime-changes.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>中看到 <span style="color: #ff0000;"><strong>onRetainNonConfigurationInstance </strong></span>這個東西，查了三篇文章大概看了一下內容看起來應該蠻實用的，之後有空實作完再把結果Post上來。</p>
<p><strong><a href="http://chipin01.blogspot.com/2009/04/android.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">[Android] 煩人的螢幕旋轉 @ 生活藝術 ● 藝術生活<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong><br />
<a href="http://chengbs.iteye.com/blog/1156167" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>activity状态的保存和保持(onRetainNonConfigurationInstance和getLastNonConfigurationInstance) @ chengbs</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a><br />
<a href="http://blog.yam.com/ipray/article/29768416" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>[Android] 比較onSaveInstanceState() 與 onRetainNonConfigurationInstance() 函式 @ 我思故我在</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a></p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2120/android-screen-orientation-event%e8%9e%a2%e5%b9%95%e6%96%b9%e5%90%91%e8%99%95%e7%90%86acitivity-liftcycle/" data-wpel-link="internal">Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2120/android-screen-orientation-event%e8%9e%a2%e5%b9%95%e6%96%b9%e5%90%91%e8%99%95%e7%90%86acitivity-liftcycle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
