Android百日程序: Fragment動態管理和生命期
來源:程序員人生 發布時間:2015-01-08 14:00:32 閱讀次數:3746次
之前寫過Fragment使用的程序,Fragment可以靜態,也能夠動態載入內存中的,這1章進1步看看如何動態地更換Fragment和看看Fragment生命期都有甚么函數。
本章利用響應菜單點擊事件,輪番載入不同的Fragment,顯示不同的界面,效果以下:
開始的是沒有載入Fragmen為空白:

點擊菜單的NEXT FRAGMENT VIEW,就進入下1個界面,載入兩個:

繼續點擊顯示Fragment 1:

繼續點擊,顯示Fragment2:

然后就是循環了:

如此循環顯示不同畫面。
1 首先實現這1效果的關鍵代碼,就是在菜單響應函數中輸入以下代碼:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.next_fragment_view_menu_item: {
FragmentManager fragManager = getFragmentManager();
FragmentTransaction fragTrans = fragManager.beginTransaction();
if (0 == turnNum) {
Fragment1 frag1 = new Fragment1();
Fragment2 frag2 = new Fragment2();
fragTrans.replace(R.id.frame_layout1, frag1);
fragTrans.replace(R.id.frame_layout2, frag2);
} else if (1 == turnNum) {
Fragment1 frag1 = new Fragment1();
Fragment frag2 = fragManager.findFragmentById(R.id.frame_layout2);
fragTrans.replace(R.id.frame_layout1, frag1);
if (frag2 != null) fragTrans.remove(frag2);
} else if (2 == turnNum) {
Fragment frag1 = fragManager.findFragmentById(R.id.frame_layout1);
Fragment2 frag2 = new Fragment2();
if (frag1 != null) fragTrans.remove(frag1);
fragTrans.replace(R.id.frame_layout2, frag2);
}
turnNum++;
if (turnNum > 2) turnNum = 0;
fragTrans.addToBackStack(null);
fragTrans.commit();
return true;
}
}
return super.onOptionsItemSelected(item);
}
1 FragmentManager 是管理所有Fragment的類,故此查找已有的Fragment使用函數: Fragment frag2 = fragManager.findFragmentByI(R.id.framelayout2);注意要判斷是不是取回Fragment,如果沒有那末frag2 == null。
2 FragmentTransaction管理Fragment變更事務,所有動作,如例子中的remove, replace,都必須是在beginTransaction()和commit()之間才會生效,重復調用commit而沒有調用beginTransaction會程序崩潰的。
3 addToBackStack(null),就是手動把Fragment放在棧中,這樣可使用back按鍵退回上1層的Fragment安排。Activity是自動放到棧中的。
4 簡單邏輯:turnNum是全局變量,根據這個turnNum的值的不同使用不同的Fragment。
2 主界面的xml以下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="bill.su.fragment.MainActivity"
android:orientation="horizontal"
android:id="@+id/linear_fragment"
android:baselineAligned="false" >
<FrameLayout
android:id="@+id/frame_layout1"
android:layout_weight="1"
android:layout_width="0sp"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/frame_layout2"
android:layout_weight="1"
android:layout_width="0sp"
android:layout_height="match_parent" />
</LinearLayout>
兩個FrameLayout用來裝Fragment
3 菜單res/menu/main.xml的代碼:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="bill.su.fragment.MainActivity" >
<item
android:id="@+id/next_fragment_view_menu_item"
android:showAsAction="always"
android:title="@string/next_fragment_view_menu_item" />
</menu>
4 測試Fragment生命期的全部代碼:
package bill.su.fragment;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Fragment1 extends Fragment {
private final String TAG = "FRAGMENTTAG1";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d(TAG, "onCreateView called");
return inflater.inflate(R.layout.fragment1, container, false);
}
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
Log.d(TAG, "onAttach called");
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate called");
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreted called");
}
@Override
public void onStart(){
super.onStart();
Log.d(TAG, "onStart called");
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume called");
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause called");
}
@Override
public void onStop(){
super.onStop();
Log.d(TAG, "onStop called");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView called");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy called");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach called");
}
}
主要和Activity不同的是:
onAttached() : Fragment和Activity接起來的是調用
onCreateView(): Fragment的View創建
onActivityCreated():當Activity的onCreate()調用的時候調用
onDestroyView(): 當Fragment的view刪除的時候調用
onDetach(): Fragment從Activity中去掉的是調用
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈