一、前言
<font face = 黑体 >Fragment 是从 Android 3.0 开始引入的,翻译过去就是碎片的意思。Fragment 的作用以及应用场景我就不赘述了。这篇博文咱们就次要讲 Fragment 的创立、替换与移除这三个操作,至于 Fragment 的生命周期、如何与 Activity 进行通信等内容咱们会在前面陆续讲到的。
一、Fragment 的创立
<font face = 黑体 > 要应用 Fragment,能够通过继承 Fragment 类来创立 Fragment,在少数状况下咱们须要给 Fragment 定制一个 UI,然而,也能够为 Activity 创立一个没有 UI,只提供后盾行为的 Fragment。Fragment 的创立个别有两种形式:
- <font face = 黑体 > 通过 xml 标签创立,即动态增加 Fragment;
- <font face = 黑体 > 通过 java 代码动态创建,即动静增加 Fragment。
1.1、通过 xml 标签动态增加 Fragment(不罕用)
-
<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>
-
<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; } }
-
创立 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
-
<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>
-
<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 之间的通信。