一、前言

<font face = 黑体>Fragment 是从 Android 3.0 开始引入的,翻译过去就是碎片的意思。Fragment 的作用以及应用场景我就不赘述了。这篇博文咱们就次要讲 Fragment 的创立、替换与移除这三个操作,至于 Fragment 的生命周期、如何与 Activity 进行通信等内容咱们会在前面陆续讲到的。

一、Fragment 的创立

<font face = 黑体>要应用 Fragment,能够通过继承 Fragment 类来创立 Fragment,在少数状况下咱们须要给 Fragment 定制一个 UI,然而,也能够为 Activity 创立一个没有 UI,只提供后盾行为的 Fragment。Fragment 的创立个别有两种形式:

  1. <font face = 黑体>通过 xml 标签创立,即动态增加 Fragment;
  2. <font face = 黑体>通过 java 代码动态创建,即动静增加 Fragment。

1.1、通过 xml 标签动态增加 Fragment(不罕用)

  1. <font face = 黑体>在 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>
  2. <font face = 黑体>创立 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;    }}
  3. 创立 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;    }}
  4. 而后咱们启动 IndexActivity 就能够看到成果了。

1.2、通过 Java 代码动静增加 Fragment

  1. <font face = 黑体>动静增加 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>
  2. <font face = 黑体>动静增加 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 的替换与移除

<font face = 黑体>Fragment 的替换与移除也都是通过 FragmentManager 和 FragmentTransaction 来实现的。

<font face = 黑体>咱们先来看下成果:


<font face = 黑体>具体代码如下所示

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;        }    }}

三、源码

<font face = 黑体>源码曾经上传至 github,下一篇博文咱们讲 Fragment 与 Activity 之间的通信。