当前位置: 代码迷 >> Android >> Android多日程序: Fragment动态管理和生命期
  详细解决方案

Android多日程序: Fragment动态管理和生命期

热度:58   发布时间:2016-04-28 03:04:00.0
Android百日程序: Fragment动态管理和生命期

之前写过Fragment使用的程序,Fragment可以静态,也可以动态载入内存中的,这一章进一步看看如何动态地更换Fragment和看看Fragment生命期都有什么函数。


本章利用响应菜单点击事件,轮流载入不同的Fragment,显示不同的界面,效果如下:

开始的是没有载入Fragmen为空白:


点击菜单的NEXT FRAGMENT VIEW,就进入下一个界面,载入两个:


继续点击显示Fragment 1:


继续点击,显示Fragment2:


然后就是循环了:



如此循环显示不同画面。

一 首先实现这一效果的关键代码,就是在菜单响应函数中输入如下代码:

	@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按键退回上一层的Fragment安排。Activity是自动放到栈中的。

4 简单逻辑:turnNum是全局变量,根据这个turnNum的值的不同使用不同的Fragment。

二 主界面的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


三 菜单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>

四 测试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中去掉的是调用




  相关解决方案