Fragment后续

使用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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值