程序员人生 网站导航

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

栏目:综合技术时间:2015-01-08 14:00:32

之前写过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中去掉的是调用




------分隔线----------------------------
------分隔线----------------------------

最新技术推荐