Bootstrap

这是一份关于Fragment的详细使用教程

Fragment的产生

在Fragment(android 3.0)诞生前,安卓开发中通常使用Activity来展示界面,但它有一定的局限性:

  1. 界面中的View控件较多较复杂时,操作麻烦
  2. 手机和平板中展示的效果不一致

为了在Android上为用户提供动态的、多窗口的交互体验,我们需要将UI组件和Activity操作封装成模块进行使用,使得我们可以在activity中对这些模块进行切入切出操作,而这些模块就是Fragment

Fragment的应用场景

如上是官方给出的一张图片,可以看出,平板电脑因为尺寸较大,展示item详情的FragmentB直接显示在了列表右边区域, 而手机屏幕比较小,故需要跳转才能看到FragmentB,类似的具体的例子:手机和平板中的设置界面

Fragment的使用

  • 静态使用Fragment:在activity的XML布局文件中定义fragment
  • 动态使用Fragment:在activity运行时用代码动态添加fragment
  • v4包下Fragment的使用:为了兼容3.0以前的版本,推荐使用v4包下的Fragment

创建和使用Fragment的步骤:

  1. 创建子类继承Fragment
  2. 重写onCreateView()方法定义fragment的布局
  3. 将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的生命周期图

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

 

 

 

;