基础知识:七、Fragment

七、Fragment


1、Fragment跟Activity之间是如何传值的
当Fragment跟 Activity 绑定之后,在Fragment中可以直接通过 getActivity()方法获取到
其绑定的Activity 对象,这样就可以调用Activity的方法了。在Activity中可以通过如下方法获取到
Fragment实例
FragmentManager fragmentManager = getFragmentManager(); Fragment fragment = fragmentManager.findFragmentByTag(tag); Fragment fragment = fragmentManager.findFragmentById(id);
获取到Fragment之后就可以调用Fragment的方法。也就实现了通信功能。

2、描述一下Fragment的生命周期


3、Fragment的replace和add方法的区别

Fragment本身并没有replace和add方法,这里的理解应该为使用FragmentManager的replace
和add两种方法切换Fragment时有什么不同。
我们经常使用的一个架构就是通过RadioGroup切换Fragment,每个Fragment 就是一个功能模块。
case R.id.rb_1: rb_1.setBackgroundColor(Color.RED); transaction.show(fragment1); // transaction.replace(R.id.fl, fragment1, "Fragment1"); break; case R.id.rb_2: rb_2.setBackgroundColor(Color.YELLOW); // transaction.replace(R.id.fl, fragment2, "Fragment2"); transaction.show(fragment2); break; case R.id.rb_3: rb_3.setBackgroundColor(Color.BLUE); // transaction.replace(R.id.fl, fragment3, "Fragment3"); transaction.show(fragment3); break;
实现这个功能可以通过replace和add两种方法。
Fragment 的容器一个 FrameLayout,add 的时候是把所有的 Fragment 一层一层的叠加到了
FrameLayout上了,而replace的话首先将该容器中的其他Fragment去除掉然后将当前Fragment
添加到容器中。
一个Fragment 容器中只能添加一个Fragment 种类,如果多次添加则会报异常,导致程序终止,
而replace则无所谓,随便切换。
因为通过add 的方法添加的Fragment,每个Fragment只能添加一次,因此如果要想达到切换效
果需要通过 Fragment 的的 hide 和 show方法结合者使用。将要显示的 show 出来,将其他 hide
起来。这个过程Fragment的生命周期没有变化。
通过 replace 切换 Fragment,每次都会执行上一个 Fragment 的 onDestroyView,新 Fragment
的onCreateView、onStart、onResume方法。

基于以上不同的特点我们在使用的使用一定要结合着生命周期操作我们的视图和数据。


4、Fragment如何实现类似Activity栈的压栈和出栈效果的?
Fragment 的事物管理器内部维持了一个双向链表结构,该结构可以记录我们每次 add 的
Fragment和replace的Fragment,然后当我们点击back按钮的时候会自动帮我们实现退栈操作。
Addthistransactiontothebackstack.Thismeansthatthetransactionwillberememberedafteritiscommitted, andwillreverseitsoperationwhenlaterpoppedoffthestack.
Parameters: name An optional name for this back stack state, or null.
transaction.addToBackStack("name");
//实现源码 在 BackStackRecord 中 public FragmentTransaction addToBackStack(String name) { if (!mAllowAddToBackStack) { throw new IllegalStateException( "This FragmentTransaction is not allowed to be added to the back stack."); } mAddToBackStack = true; mName = name; return this; } //上面的源码仅仅做了一个标记
除此之外因为我们要使用FragmentManger用的是FragmentActivity,因此FragmentActivity
的onBackPress方法必定重新覆写了。打开看一下,发现确实如此。
/**
* Take care of popping the fragment back stack or finishing the activity * as appropriate. */ public void onBackPressed() { if (!mFragments.popBackStackImmediate()) { finish(); } } //mFragments 的原型是 FragmentManagerImpl,看看这个方法都干嘛了
@Override public boolean popBackStackImmediate() { checkStateLoss(); executePendingTransactions(); return popBackStackState(mActivity.mHandler, null, -1, 0); }
//看看 popBackStackState 方法都干了啥,其实通过名称也能大概了解 只给几个片段吧,代码太多 了 while (index >= 0) { //从后退栈中取出当前记录对象 BackStackRecord bss = mBackStack.get(index); if (name != null && name.equals(bss.getName())) { break; } if (id >= 0 && id == bss.mIndex) { break; } index--; }


5、Fragment在你们项目中的使用

Fragment是android3.0 以后引入的的概念,做局部内容更新更方便,原来为了到达这一点要
把多个布局放到一个 activity 里面,现在可以用多 Fragment 来代替,只有在需要的时候才加载
Fragment,提高性能。
Fragment的好处:
(1)Fragment可以使你能够将activity 分离成多个可重用的组件,每个都有它自己的生命周期和
UI。
(2)Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电
脑。
(3)Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、
交换等。
(4)Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。
(5)Fragment 解决Activity间的切换不流畅,轻量切换。
(6)Fragment 替代TabActivity做导航,性能更好。
(7)Fragment 在4.2.版本中新增嵌套fragment使用方法,能够生成更好的界面效果。


6、如何切换fragement,不重新实例化

翻看了Android官方Doc,和一些组件的源代码,发现replace()这个方法只是在上一个Fragment
不再需要时采用的简便方法.
正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,
show()另一个。
这样就能做到多个Fragment切换不重新实例化:
public void switchContent(Fragment from, Fragment to) {
if (mContent != to) {
mContent = to;
FragmentTransaction transaction
=mFragmentMan.beginTransaction().setCustomAnimations(android.R.anim.fad
e_in, R.anim.slide_out);
if (!to.isAdded()) { // 先判断是否被add过
transaction.hide(from).add(R.id.content_frame, to).commit(); // 隐藏
当前的fragment,add下一个到Activity中
} else {
transaction.hide(from).show(to).commit(); // 隐藏当前的
fragment,显示下一个
}
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值