前言
在学习完Fragment的静态使用和Fragment常用API后,这节我们就来学习下Fragment的动态加载吧。
今天涉及的内容:
- Fragment动态加载前的准备
- Fragment动态加载实例
- Fragment动态加载和静态加载的区别
- 参考文章
先来波效果图
一. Fragment动态加载前的准备
在动态加载Fragment之前,我们先要在FragmentActivity对应的activity_main.xml中添加一个帧布局作为Fragment的容器。以我写的一个activity_main.xml代码为例:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Hello World!"
android:textColor="#000000"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="Button"
app:layout_constraintEnd_toStartOf="@+id/btn_test"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_text" />
<Button
android:id="@+id/btn_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/btn_confirm"
app:layout_constraintTop_toTopOf="@+id/btn_confirm" />
<FrameLayout
android:id="@+id/fr_layout"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="5dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_confirm" />
</androidx.constraintlayout.widget.ConstraintLayout>
以上代码中 FrameLayout 即为Fragment要显示的容器。
二.Fragment动态加载实例
Fragment的动态加载基本上用到两个方法,一个是 add(),一个是replace()。其中add()多用于"显示当前Fragment,隐藏其他Fragment"的情况,而replace()则多用于"显示当前Fragment,关闭上一个Fragment"的情况。由于"显示当前Fragment,隐藏其他Fragment"的情况用得比较多,所以下面以add()动态加载为例。
下面以FragmentActivity中动态加载FragmentA和FragmentB为例。
2.1 写一个 FragmentA,继承Fragment
FragmentA代码如下:
public class FragmentA extends Fragment {
private View mLayoutView;
private Context mContext;
private TextView mTvTestA;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mContext=context;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mLayoutView = inflater.inflate(R.layout.fragment_a, container, false);
initView();
initData();
setListener();
return mLayoutView;
}
private void initView(){
mTvTestA=mLayoutView.findViewById(R.id.tv_a);
}
private void initData(){
Bundle bundle=getArguments();
String value="";
if(bundle!=null) {
value = bundle.getString("A");
}
mTvTestA.setText("我是 A Fragment: "+value);
}
private void setListener(){}
}
2.2 FragmentA对应布局
FragmentA对应布局代码fragment_a.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:clickable="true"
android:background="@color/blue">
<TextView
android:id="@+id/tv_a"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="Hello World!"
android:textColor="#000000"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2.3 FragmentB类及对应xml文件
FragmentB代码与FragmentA基本一样,布局也一样,只不过把对应的a改成了b,这里就不做多的解释了。