一,概述
为了支持动态的或者是多个页面同时显示,android提供了fragment组件;
如果应用最小支持的sdk为11以上,则可以直接使用系统类库,否则要使用 Support Library
二,创建一个fragment
继承于Fragment类,必须要提供onCreateView回调提供Fragment的视图;
每个Fragment类似于Activity,都会有自己的生命周期,其中部分的回调受所在的Activity控制,比如Activity调用onPause()会导致它所有的Fragment调用onPause()
三,使用xml在Activity中添加Fragment
1,在xml中添加的fragment无法动态添加和移除,所以必须在代码中动态添加或者移除
2,使用FragmentActivity代替Activity
四,动态使用Fragment
1,FragmentActivity必须有root view
FrameLayout rootView = new FrameLayout(this); rootView.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); rootView.setId(android.R.id.primary);
2,在FragmentActivity onCreate中添加最初始的Fragment
3,FragmentManager
The FragmentManager
class provides methods that allow you to add, remove, and replace fragments to an activity at runtime in order to create a dynamic experience.
具体的实现是FragmentTransaction;
FragmentTransaction ft = fragmentManager.beginTransaction();
4,addToBackStack
可以在commit之前使用addToBackStack将上次的transaction放到一个堆栈中,这样点击后退键的时,就能恢复上次的操作;
</pre><pre name="code" class="java"> 5,BackStackEntry
<pre name="code" class="java"> FragmentTransaction 添加删除fragment并不会对这个栈进行操作,只有addToBackStack,popBackStack才可以;
<pre name="code" class="java"> 6,popBackStack(tag, 0);
可以清空包括tag及其之上的所有fragment
五:fragment之间的交互
1,fragment之间的交互要通过它们关联的activity来进行
2,activity可以通过findFragmentById来获取对应的fragment,并进行交互;
也可以通过fragmentManager.findFragmentByTag(tag)获取对应的fragment;
在添加的时候使用FragmentTransactio add(android.R.id.primary,fragment, fragment.getClass().getName())来设置tag;
六,源码
1,popBackStack
会将其上的所有节点删除;
for (int i=mBackStack.size()-1; i>index; i--) { 1446 states.add(mBackStack.remove(i)); 1447 }
2,addOnBackStackChangedListener
这个回调不管是添加还是删除stack节点都会调用