特点 :
- Fragment是依赖于Activity的,不能独立存在的。
- 一个Activity里可以有多个Fragment。
- 一个Fragment可以被多个Activity重用。
- Fragment有自己的生命周期,并能接收输入事件。
- 我们能在Activity运行时动态地添加或删除Fragment。
Fragment的优势有以下几点:
- 模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。
- 可重用(Reusability):多个Activity可以重用一个Fragment。
- 可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。
基本使用:
onCreateView(),该方法返回Fragment的UI布局,需要注意的是inflate()的第三个参数是false,因为在Fragment内部实现中,会把该布局添加到container中,如果设为true,那么就会重复做两次添加
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_1, container, false);
TextView view = root.findViewById(R.id.text);
view.setText(mParam);
return root;
}
将fragment添加到Activity
创建完Fragment后,接下来就是把Fragment添加到Activity中。在Activity中添加Fragment的方式有两种:
- 静态添加:通过xml的方式添加,缺点是一旦添加就不能在运行时删除。
- 动态添加:运行时添加,这种方式比较灵活,因此建议使用这种方式。
虽然Fragment能在XML中添加,但是这只是一个语法糖而已,Fragment并不是一个View,而是和Activity同一层次的。
本文介绍的是动态添加的方式:
在onCreate()中,通过以下代码将Fragment添加进Activity中。
if (bundle == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, Fragment1.newInstance("hello world"), "f1") //.addToBackStack("fname")
.commit();
}
这里需要注意几点:
-
因为我们使用了support库的Fragment,因此需要使用
getSupportFragmentManager()获取FragmentManager。 -
add()是对Fragment众多操作中的一种,还有remove(),replace()等,第一个参数是根容器的id(FrameLayout的id,即”@id/container”),第二个参数是Fragment对象,第三个参数是fragment的tag名,指定tag的好处是后续我们可以通过Fragment1 frag = getSupportFragmentManager().findFragmentByTag("f1")从FragmentManager中查找Fragment对象。 -
在一次事务中,可以做多个操作,比如同时做
add().remove().replace()
fragment生命周期

fragment与activity生命周期间的联系

- Fragment的onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()都是在Activity的onStart()中调用的。
- Fragment的onResume()在Activity的onResume()之后调用。
Back Stack
我们知道Activity有任务栈,用户通过startActivity将Activity加入栈,点击返回按钮将Activity出栈。Fragment也有类似的栈,称为回退栈(Back Stack),回退栈是由FragmentManager管理的。
默认情况下,Fragment事务是不会加入回退栈的,如果想将Fragment事务加入回退栈,则可以加入addToBackStack("")。如果没有加入回退栈,则用户点击返回按钮会直接将Activity出栈;如果加入了回退栈,则用户点击返回按钮会回滚Fragment事务。
通信
1、Activity向fragment传递数据
(1) 如果在创建Fragment时要传入参数,可通过setArguments(Bundle bundle)方式添加,可以在Fragment的onAttach()中通过getArguments()获得传进来的参数。也即通过bundle来传递数据
(2)获取Fragment对象,并调用Fragment的方法即可,比如要将一个字符串传递给Fragment,则在Fragment中定义方法:
public void setString(String str) {
this.str = str;
}
并在Activity中调用fragment.setString("hello")即可。
2、fragment向Activity传递数据
定义一个用于传递信息的接口A,并设计好用于传递信息用的待实现函数。
在fragment中定义一个用于传递信息的函数B,该函数以A为参数,并调用A中的方法,将需要传递的数据作为函数参数传递进去
在Activity中调用fragment中的信息传递函数B,并实现用于信息传递的接口A,作为调用B的参数。在实现的接口A的函数中就可以接收并处理由fragment传递过来的数据了。
参考:https://cloud.tencent.com/developer/article/1394289
3、fragment之间传递数据
由于Fragment之间是没有任何依赖关系的,因此如果要进行Fragment之间的通信,建议通过Activity作为中介,不要Fragment之间直接通信。
Android Activity和Fragment之间的跳转方式
本文详细介绍了Android中的Fragment,包括其特点、优势、基本使用方法、动态添加到Activity的方式、Fragment的生命周期、与Activity的生命周期联系、回退栈的概念以及Fragment间通信的策略。重点讲解了如何在Activity中动态添加和管理Fragment,并强调了通过Activity中介进行Fragment间通信的重要性。
1万+

被折叠的 条评论
为什么被折叠?



