一、前言

<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 就可以看到效果了。

静态添加Fragment

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 之间的通信


Maenj_Ba_lah
28 声望7 粉丝

真正的大师,永远怀着一颗学徒的心。