Transcript 單元28

單元28 Fragment的進階用法
1
Fragment的各種狀態轉變階段
2
控制FrameLayout的顯示和隱藏
程式剛開始執行的時候先不要顯示畫面右邊的
FrameLayout,等到使用者啟動局數統計畫面時才
讓FrameLayout出現。設定FrameLayout的隱藏和
顯示只要利用Visibility屬性,先在程式的介面描述檔
中將這個屬性設定為gone。當
GameResultFragment以及GameResultFragment2
即將出現在螢幕上的時候會執行onResume(),當它
們即將從螢幕上消失的時候會執行onPause(),因此
只要我們在onResume()方法中讓FramemLayout出
現,在onPause()方法中讓FramemLayout消失即可。
3
控制FrameLayout的顯示和隱藏
步驟一:執行Eclipse開啟前一個單元的「電腦猜拳
遊戲」程式專案的介面佈局檔
res/layout/main.xml,在<FrameLayout>
標籤中加入以下粗體字的屬性:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
… >
<fragment android:id="@+id/fragGame"
… />
<FrameLayout android:id="@+id/frameLayout"
…
android:visibility="gone" />
</LinearLayout>
4
控制FrameLayout的顯示和隱藏
步驟二: 開啟程式檔src/(套件路徑名
稱)/GameResultFragment.java,在程式碼編輯視窗中
按下滑鼠右鍵,然從在出現的快選功能表中選擇Source
> Override/Implement Methods…,在對話盒左邊的清
單中勾選onPause()再按下OK按鈕,然後加入以下粗體
字的程式碼:
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
…(原來的程式碼)
getActivity().findViewById(R.id.frameLayout).setVisibility(View.VISIBLE);
}
@Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
getActivity().findViewById(R.id.frameLayout).setVisibility(View.GONE);
}
5
控制FrameLayout的顯示和隱藏
步驟三: 仿照步驟二的方法修改程式檔src/(此程式專案的套件名
稱)/GameResultFragment2.java如下:
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
…(原來的程式碼)
getActivity().findViewById(R.id.frameLayout).setVisibility(View.VISIBLE);
}
@Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
getActivity().findViewById(R.id.frameLayout).setVisibility(View.GONE);
}
6
Fragment的Back Stack功能和動畫效果
所謂Back Stack是說,當使用者在操作某一個程式
時又啟動另一個程式,在這種情況下,Android系統
會先暫停目前的程式,然後切換到新的程式,當使
用者按下「回上一頁」按鈕時,就會回到前一個程
式。對於程式和程式之間的切換,Android系統會自
動使用Back Stack功能,但是對於同一個程式內的
Fragment之間的切換,Android系統並不會自動記
錄Back Stack,而是要由程式設計者自行處理。
7
Fragment的Back Stack功能和動畫效果
如果只是單純記錄Fragment切換的Back Stack只要
使用FragmentTransaction物件提供的
addToBackStack()方法即可(必須在commit()方法
之前呼叫)。但是使用Back Stack時還有一個需要
考量的問題是Fragment物件的生命週期會因此改變,
這有可能影響到程式中對於Fragment物件的控管機
制。
當沒有將Fragment加入Back Stack時,如果
Fragment被移出畫面(也就是從螢幕上消失)就會
被系統刪除,可是如果將Fragment加入Back Stack
中,當Fragment被移出畫面時並不會被刪除而是處
於停止狀態,以便使用者按下回復鍵的時候能夠重
新顯示在螢幕上。
8
重新檢視「電腦猜拳遊戲」程式
當使用者按下「顯示結果」的按鈕時會加入一個新的
Fragment物件並賦予它一個Tag,只是這個Tag在下
一次使用者按下同一個按鈕時又會使用相同的名稱
(也就是TAG_FRAGMENT_RESULT_1或
TAG_FRAGMENT_RESULT_2),因此造成程式中
會有名稱重複的Fragment(如果沒有使用Back Stack,
則從畫面消失的Fragment會被系統刪除,所以沒有名
稱重複的問題)。為了讓程式支援Back Stack功能,
我們需要修改二個部分。
9
修改「電腦猜拳遊戲」程式
為了讓程式支援Back Stack功能,我們需要將
Fragment物件的Tag名稱改用流水號,也就是從1開始
依序往後編號,讓每一個Fragment都有不同的名稱。
FragmentTransaction物件還提供setTransition()方法可
以設定Fragment切換的動畫效果,它的使用方式很簡
單,請參考程式範例中的程式碼就可以瞭解。
修改後的程式碼請參考書上說明。
10