Fragment 的创建、替换与移除

    科技2022-07-12  139

    一、Fragment 概述

    Fragment 是从 Android 3.0 开始引入的,翻译过来就是碎片的意思。Fragment 的作用以及使用场景我就不赘述了,这篇博文我们就主要讲 Fragment 的创建、替换与移除这三个操作,至于 Fragment 的生命周期、如何与 Activity 进行通信等内容我们会在后面陆续讲到的。

    一、Fragment 的创建

    要使用 Fragment,可以通过继承 Fragment 类来创建 Fragment,在多数情况下我们需要给 Fragment 定制一个 UI,但是,也可以为 Activity 创建一个没有 UI,只提供后台行为的 Fragment。Fragment 的创建一般有两种方式:

    通过 xml 标签创建,即静态添加 Fragment;通过 java 代码动态创建,即动态添加 Fragment。

    1.1、通过 xml 标签静态添加 Fragment(不常用)

    在 IndexActivity 的 activity_index 布局中加入 fragment 标签,并通过 name 关联到相应的 Fragment;<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".IndexActivity"> <fragment android:id="@+id/fragment_center" android:name="com.zjgsu.fragmentdemo.fragment.CenterFragment" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="5" /> <fragment android:id="@+id/fragment_bottom" android:name="com.zjgsu.fragmentdemo.fragment.BottomFragment" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> 创建 CenterFragment;public class CenterFragment extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_center, container, false); return view; } } 创建 BottomFragment;public class BottomFragment extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_bottom, container, false); return view; } } 然后我们启动 IndexActivity 就可以看到效果了。

    1.2、通过 Java 代码动态添加 Fragment

    动态添加 Fragment 则不需要在 IndexActivity 的 activity_index 布局中加入 fragment 标签;<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".IndexActivity"> <FrameLayout android:id="@+id/layout_center" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="5" /> <FrameLayout android:id="@+id/layout_bottom" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> 动态添加 Fragment 主要涉及 FragmentManager 和 FragmentTransaction 这两个操作对象。public class IndexActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_index); /* 动态添加 Fragment 到 Activity 中 要涉及到两个操作对象 FragmentManager 和 FragmentTransaction */ FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.layout_center, new CenterFragment()); fragmentTransaction.add(R.id.layout_bottom, new BottomFragment()); fragmentTransaction.commit(); } }

    二、Fragment 的替换与移除

    Fragment 的替换与移除也都是通过 FragmentManager 和 FragmentTransaction 来完成的。

    我们先来看下效果: 具体代码如下所示

    public class Index2Activity extends AppCompatActivity implements View.OnClickListener { private Button btnReplace; private Button btnRemove; private FirstFragment f1; private SecondFragment f2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_index2); initView(); } // 初始化 View private void initView() { btnReplace = findViewById(R.id.btn_replace); btnRemove = findViewById(R.id.btn_remove); btnReplace.setOnClickListener(this); btnRemove.setOnClickListener(this); initFragment(); } // 初始化 Fragment private void initFragment() { f1 = new FirstFragment(); f2 = new SecondFragment(); addFragment(); } // 添加 Fragment private void addFragment() { getSupportFragmentManager() .beginTransaction() .add(R.id.layout_container, f1) .commit(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_replace: getSupportFragmentManager() .beginTransaction() .replace(R.id.layout_container, f2) // 点击 返回键 可以回到原来的 Fragment .addToBackStack(null) .commit(); break; case R.id.btn_remove: getSupportFragmentManager() .beginTransaction() .remove(f2) .commit(); break; } } }

    三、源码

    源码已经上传至 github,下一篇博文我们讲 Fragment 与 Activity之间的通信。

    Processed: 0.009, SQL: 8