Fragment的产生
在Fragment(android 3.0)诞生前,安卓开发中通常使用Activity来展示界面,但它有一定的局限性:
1、界面中的View控件较多较复杂时,操作麻烦
2、手机和平板中展示的效果不一致
为了在Android上为用户提供动态的、多窗口的交互体验,我们需要将UI组件和Activity操作封装成模块进行使用,使得我们可以在activity中对这些模块进行切入切出操作,而这些模块就是Fragment。
Fragment的应用场景
如上是官方给出的一张图片,可以看出,平板电脑因为尺寸较大,展示item详情的FragmentB直接显示在了列表右边区域, 而手机屏幕比较小,故需要跳转才能看到FragmentB(手机上虽然是两个Activity,但是用的是同一个FragmentB),类似的具体的例子:手机和平板中的设置界面。
Fragment的使用:
- 静态使用Fragment:在activity的XML布局文件中定义fragment
- 动态使用Fragment:在activity运行时用代码动态添加fragment
- v4包下Fragment的使用:为了兼容3.0以前的版本,推荐使用v4包下的Fragment
创建和使用Fragment的步骤:
- 创建子类继承Fragment
- 重写onCreateView()方法定义fragment的布局
- 将fragment引入到Activity中
public class NewsFragment extends Fragment { /** * onCreateView是fragment第一次创建绘制用户界面时系统回调的方法 * @param inflater 布局填充器,用于将xml文件转换成view对象 * @param container 当前fragment插入activity的布局视图对象 * @param savedInstanceState 存储上一个fragment的信息 * @return 返回值View表示当前加载的fragment视图,若不提供视图可以返回Null */ @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //将指定资源的xml文件转换成具体的view对象 View view = inflater.inflate(R.layout.fragment_news,null); return view; } }
在Activity的布局文件中引用:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <fragment android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.example.limanma.cr7rm.fragment.NewsFragment"/> </LinearLayout>
如上就是静态使用fragment的过程,非常简单,接下来看看动态使用:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1.创建Fragment的管理器对象 FragmentManager manager = getSupportFragmentManager(); //2.开启事务 FragmentTransaction transaction = manager.beginTransaction(); //3.调用事务的动态操作,这里是添加 transaction.add(R.id.fl_container,new NewsFragment()); //4.提交事务 transaction.commit(); } }
Fragment的生命周期:(Fragment is added之后,Fragment执行如下方法)
Fragment和Activity生命周期的对比:
Fragment与Activity间的通信
- Activity向Fragment传值
- Fragment向Activity传值
- Fragment与Fragment间传递数据
Activity向Fragment传值:Activity调用setArguments()传递数据,Fragment调用getArguments()接收数据
Fragment向Activity传值:接口回调,具体步骤如下:
1.在Fragment中定义传值的回调接口,在生命周期的onAttach()或onCreate()方法中获取接口的实现
public interface TestInterface{ void fromFragmentToActivity(String msg); } @Override public void onAttach(Context context) { super.onAttach(context); mTestInterface = (TestInterface) getActivity(); }
2.在Fragment需要传值的位置调用回调接口方法传值
@Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_news, null); ... mTestInterface.fromFragmentToActivity("哈哈哈"); return view; }
3.在Activity中实现回调接口并重写回调方法,获取传递过来的值
public class MainActivity extends AppCompatActivity implements NewsFragment.TestInterface { ... @Override public void fromFragmentToActivity(String msg) { Log.i("TAG","从绑定的Fragment传递过来的数据:" + msg); } }
Fragment与Fragment间传递数据:
ListFragment和DialogFragment的应用
ListFragment继承于Fragment,ListFragment的内容是以列表(list)的形式显示的,它的简单使用可参照如下链接:
https://www.kancloud.cn/digest/androidtome/117268
DialogFragment在android 3.0时被引入,官方推荐使用DialogFragment来管理对话框,它的详细使用可参照如下链接:
https://blog.csdn.net/lmj623565791/article/details/37815413
————————————————
版权声明:本文为CSDN博主「里曼马都」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35770354/article/details/83477313