(转)一份关于Fragment的详细使用教程

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

原文地址:https://www.cnblogs.com/wangle1001986/p/12843920.html