Fragment的学习总结 | 青训营笔记

139 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第2天

Fragment的基本概念

Fragment,直译为“碎片”,“片段”。Fragment是Android3.0后引入的一个新的API。Fragment 表示 FragmentActivity 中的行为或界面的一部分,可以通俗的理解为一个小型的Activity,或是"Activity片段"。为了避免在一个很大的布局中管理过多的组件这样的麻烦,我们就需要用到Fragment。它可以在一个 Activity 中组合多个片段,从而构建多窗格界面,并在多个 Activity 中重复使用某个片段,且可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理。Fragment必须在Activity中嵌套使用,不能单独拿出来运行,所以虽然Fragment有自己的生命周期,但是也会受到Activity的生命周期影响,所以当 Activity 暂停时,Activity 的所有片段也会暂停;当 Activity 被销毁时,所有片段也会被销毁。

Fragment的生命周期图

Fragment有生命11个周期函数 image.png

Fragment的子类(4种)

  • 对话框:DialogFragment
  • 列表:ListFragment
  • 选项设置:PreferredFragment
  • WebView界面:WebViewFragment

Fragment的简单调用

创建一个Fragment(AFragment)

在这里我创建一个AFragment.java文件,继承Fragment包,里面用的onCreateView来创建该fragment对应的视图,然后调用确保完全创建视图的方法(onViewCreated)。

public class AFragment extends Fragment {
private TextView AF_title;
@Nullable
@Override
//设置布局文件
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_a,container,false);
return view;
}
//创建后调用
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//
AF_title=view.findViewById(R.id.fragmentA_title);
}
}

然后在layout文件创建AFragment对应的xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">

<TextView
android:id="@+id/fragmentA_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="20sp"
android:text="我是AFragment"
android:gravity="center"/>
</LinearLayout>
image.png

调用Fragment

在这里我创建了一个Empty Activity,命名为Container.Activity。用AFragment声明aFragment变量,add()用的是commitAllowingStateLoss()方法,因为conmmit会遇到某些错误,commitAllowingStateLoss()能够更好的兼容某些情况。

public class ContainerActivity extends AppCompatActivity {

private AFragment aFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_container);

//实例化aFragment
aFragment = new AFragment();
//把AFragment添加到Activity中,记得调用commit
getSupportFragmentManager().beginTransaction().add(R.id.ca_container, aFragment).commitAllowingStateLoss();
}}

container.activity中对应的xml布局

FrameLayout(帧布局)是直接在屏幕上开辟出一块空白的区域,帧布局的大小由控件中最大的子控件决定。虽然默认会将控件放置在左上角,也可以通过layout_gravity属性将它指定到其他的位置。

<FrameLayout
android:id="@+id/ca_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
image.png

可以看到AFragment已经在container.activity中显现出来了。

切换不同的Fragment

为了在container.activity中切换fragment,在activity_container.xml中我新建一个Button按钮来切换fragment。

<Button
android:id="@+id/ca_change"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textAllCaps="false"
android:text="更换Fragment" />
image.png

同时按照上文一样创建BFragment.java,对应的布局文件相同。

image.png

回到contaier.activity中,对Button和BFragment进行声明和实例化。

public class ContainerActivity extends AppCompatActivity {

private AFragment aFragment;
private BFragment bFragment;
private Button CA_change;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_container);

//实例化aFragment
aFragment = new AFragment();
//把AFragment添加到Activity中,记得调用commit
getSupportFragmentManager().beginTransaction().add(R.id.ca_container, aFragment).commitAllowingStateLoss();

CA_change=findViewById(R.id.ca_change);
CA_change.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (bFragment==null){
bFragment=new BFragment();
}
getSupportFragmentManager().beginTransaction().replace(R.id.ca_container,bFragment).commitAllowingStateLoss();
}
});
}
}

可以看到,点击之后,AFragment切换到了BFragment.

image.png ------------------------ image.png

总结

以上是Fragment简单的一种调用和切换函数,随着课程的深入,后面还会学到更多的生命周期函数。