使用Fragment Transaction
在运行时,Fragment Transaction 可以用来在一个Activity内添加、删除替换Fragment。使用Fragment Transaction 可以让布局称为动态的,也就是说,他们会根据与用户的交互和应用程序的状态进行自适应和改变。
每个Fragment Transaction都可以支持包括添加、删除替换Fragment等操作的任意组合。他们同意也支持过度动画的规范以及是否在back栈中包含Transaction(翻译为交易)
一个新的Fragment Transaction是通过使用Activity的Fragment Manager中的beginTransaction 方法创建的,在是指显示动画之前,可以根据要求使用 add remove replace方法来修改布局,并设置恰当的back栈行为。当准备执行改变时,调用commit方法将食物添加到UI队列
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
//添加 删除 或替换指定Fragment
//指定动画
//如果需要的话,添加到back栈中
fragmentTransaction.commit();
添加、删除替换fragment
添加一个新的UIFragment是,需要指定添加到的Fragment实例和将要防止它的容器View.另外,还可以为这个Fragment制定一个tag标识,后面通过这个标识,可以使用findFragmentByTag方法找到相应的Fragment.
FragmentTransaction fragmentTransaction= fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.ui_container,new MyListFragment());
fragmenTransaction.commit();
想要删除一个Fragment,首先要找到对这个Fragment的引用,通常可以通过FragmentManager的findFragmentByhId或者findFragmentByTag方式来实现。然后把找到的Fragment实例作为参数传给FragmentTransaction的remove方法。
FragmentTransaction fragmentTransaction =fragmentTransaction.beginTransaction();
Fragment fragment=fragmentManager.findFragmentById(R.id.details_fragment);
fragmentTransaction,remove(fragment);
fragmentTransaction.commit();
还可以把一个Fragment替换称为另一个,可以使用replace方法,指定要替换的Fragment的父容器的Id、一个替换他的新Fragment和新Fragment的tag表示
FragmentTransaction fragmentTransaction=fragmentTransaction.beginTransaction();
fragmentTransaction.replace(R.id.details_fragment,new DratailFragment(selected_index) );
fragmentTransaction.commit();
sh使用FragmentManager查找Fragment
想要在Activity中查找Fragment,可以使用 FragmentManager 的findFragmentById方法来实现
如果是通过xml布局的方式吧Fragment加入到Activity中的,可以使用这个Fragment的资源标示符
myFragement =(MyFragment) fragmentManager.findFragmentById(R.id.MyFragment);
如果已通过一个Fragment Transaction添加一个Fragment,应该吧容器View的标示符指定给添加了的想要查找的Fragment。另外,还可以通过findFragmentByTag来查找在FragmentTransaction中指定了tag的Fragment
MyFragment myFragment=(MyFragment)fragmentManager.findFragmentByTag(MY_FRAGMENT_TAG);
要与没有UI的Fragmentjiaohu ,使用findFragmentByTag方法时非常必要的,因为这样的Fragment并不是Activity View层次的一部分,他没有一个资源标示符或这一个容器资源标识符,所以也无法使用findFragmentById方法找到它
使用Fragment填充动态的Activity布局
如果在运行时改变Fragment的架构和布局,最好在XML中布局之定义父容器,兵器在运行时使用FragmentTransaction来单独填充他,从而当因配置改变而英气的UI重新创建时,能确保一直行
使用容器View 填充Fragment布局
public void onCreate(Bundle savedInstanceState){
//填充包含Fragment容器的布局
setContentView(R.layout.fragment_container_layout);
FragmentManager fm=getFragmentManager();
//请检查该Fragment back栈是否被填充,如果过没有,创建并填充这个布局
DetailsFragment detailsFragment=
fm.findFragmentById(R.id.details_container);
if(detailsFragment==null){
FragmentTransaction ft=fm.beginTransaction();
ft.add(R.iddeatiils_container,new DetailsFragment());
ft.add(R.id.ui_container,new MyListFragment());
ft,comit();
}
}
首先检车这个UI是否根据之前的状态已经被填充过,为了确保用户体验的一致性,当Activity因配置改变而重新启动时,Android会保存Fragment布局和关联的back栈
因为同样的原因,当因运行时而创建可替代的布局是,最好考虑在所有布局变化中
包含所有事务所包含的所有的View容器,这样做的坏处是会到时Fragment Manager试图吧Fragment还原到已不再新的布局中的容器
在一个给定方向的布局中删除一个Fragment,只要简单的将布局定义中的该Fragment容器的visibility属性设置为gone饥渴
<LinearLayout xmlns:android=“http://schemas..android.com/apk/res/android”
android:orientation="horizontal"
android :layout_weidth="match_parent"
android:layout_height="macth_parent"
android:layout_weight="1"
>
<FrameLayout
android:id="@id/detatils_container"
android:layout_width="match_parent"
android :layout_height="match_parent"
android:layout_weight="3"
android:visibility="gone"
>
</LinearLayout>