fragment是一种控制器对象,activity委派它执行管理用户界面的任务。这样在视图切换时无需销毁activity。
activity托管fragment
activity在视图层级里提供一处位置,用来放置fragment
使用支持库版Fragment
implementation 'androidx.appcompat:appcompat:1.1.0'
activity需要继承AppCompatActivity
fragment的生命周期
fragment的生命周期与Activity一致,都需要经过onCreat,onStart,onResume,onPause,onStop,onDestory。
定义容器视图
想要使用fragment,首先要在activity中添加容器视图,这里新建一个通用的FrameLayout。替换原有Activity.xml布局文件。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".CrimeActivity">
</FrameLayout>
创建UI 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:layout_margin="16dp"
android:orientation="vertical"
tools:context=".CrimeFragment">
<!-- TODO: Update blank fragment layout -->
<TextView android:layout_width="match_parent" android:layout_height="wrap_content"
android:text="@string/crime_title_label"/>
<EditText android:layout_width="match_parent" android:layout_height="wrap_content"
android:id="@+id/crime_title"
android:hint="@string/crime_title_hint" />
<TextView android:layout_width="match_parent" android:layout_height="wrap_content"
style="?android:listSeparatorTextViewStyle"
android:text="@string/crime_details_label"/>
<Button android:layout_width="match_parent" android:layout_height="wrap_content"
android:id="@+id/crime_date"/>
<CheckBox android:layout_width="match_parent" android:layout_height="wrap_content"
android:id="@+id/crime_solved"
android:text="@string/crime_solved_label"/>
</LinearLayout>
创建Fragment.java类
继承fragment类
重写onCreate方法,此方法不进行创建fragment视图。
重写onCreatView方法,该方法实例化fragment布局,然后将实例化的View返回给托管的activity。
向FragmentManger添加UI fragment
注意两个方法的区别为:
- onCreate是指创建该fragment,类似于Activity.onCreate,你可以在其中初始化除了view之外的东西;
- onCreateView是创建该fragment对应的视图,你必须在这里创建自己的视图并返回给调用者。
FragmentManger负责管理fragment,并添加到activity中
这里重写了一个类,当activity初始化时继承这个类,里面创建了FragmentManger,当没有现成的fragment时,就创建新的。
建议写每个activity都调用fragment,防止后期出现问题。