复习Android——Fragment
Fragment是什么
Fragment是一种可以嵌入在Activity中的UI片段,它可以让程序更加合理和充分地利用大屏幕的空间。
使用Fragment
声明两个Fragment的布局文件:
<?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">
<Button
android:id="@+id/left_frag_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Button"/>
</LinearLayout>
<?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">
<TextView
android:id="@+id/right_frag_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:text="这是右边的Fragment"/>
</LinearLayout>
新建自定义的Fragment类,需要继承androidx包下的Fragment,并重写onCreateView方法,在其中绑定对应的视图文件:
public class RightFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.right_fragment, container, false);
}
}
public class LeftFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.left_fragment, container, false);
}
}
在其他布局文件中引入相关Fragment的布局:
<LinearLayout
android:id="@+id/fragment_list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<fragment
android:id="@+id/left_fragment"
android:name="com.zcd.flcdemo.Fragments.LeftFragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"/>
<fragment
android:id="@+id/right_fragment"
android:name="com.zcd.flcdemo.Fragments.RightFragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"/>
</LinearLayout>
通过<fragment>标签下的name属性来指定相关的Fragment类。
动态添加Fragment
创建另一个Fragment:
<?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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:text="这是另一个右边的Fragment"/>
</LinearLayout>
新建与之相关的Java类:
public class AntherRightFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.new_right_fragment, container, false);
}
}
更改在使用处的布局文件:
<LinearLayout
android:id="@+id/fragment_list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<fragment
android:id="@+id/left_fragment"
android:name="com.zcd.flcdemo.Fragments.LeftFragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"/>
<FrameLayout
android:id="@+id/right_layout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
向新引用的FrameLayout中动态添加内容:
//动态添加Fragment
changeFragment = findViewById(R.id.btn_change_frag);
changeFragment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
replaceFrag(new AntherRightFragment());
}
});
replaceFrag(new RightFragment());
更改方法具体实现:
private void replaceFrag(Fragment fragment){
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.commit();
}
动态添加Fragment主要分为以下步骤:
- 创建一个需要添加的Fragment实例;
- 通过调用getSupportFragmentManager方法来获取FragmentManager对象;
- 通过获取到的Fragment对象调用beginTransaction方法获取到FragmentTransaction对象用于事务的提交;
- 向容器中添加或者替换Fragment;
- 调用commit方法以提交修改的事务;
将Fragment添加到返回栈
默认情况下Fragment并没有被放到返回栈中,需要手动调用方法以将其添加到返回栈中:
private void replaceFrag(Fragment fragment){
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
只需要调用FragmentTransaction中的addToBackStack方法即可,参数为操作的名称,常常取值为null。
Fragment生命周期
Fragment的生命周期主要有一下四个状态:
-
运行状态
与Fragment关联的Activity如果处于运行状态那么Fragment也处于运行状态;
-
暂停状态
与Fragment关联的Activity如果处于暂停状态那么Fragment也处于暂停状态;
-
停止状态
与Fragment关联的Activity如果处于停止状态那么Fragment也处于停止状态;
通过FragmentTransaction的remove方法和replace方法将Fragment从Activity中移除,但是在事务提交之前调用了addToBackStack方法Fragment也会进入停止状态;
-
销毁状态
与Fragment关联的Activity如果处于销毁状态那么Fragment也处于销毁状态;
通过FragmentTransaction的remove方法和replace方法将Fragment从Activity中移除,但是在事务提交之前没有调用addToBackStack方法Fragment也会进入停止状态;
其他的生命周期方法:
-
onAttach
当Fragment和Activity建立关联时调用;
-
onCreateView
为Fragment加载视图时调用;
-
onActivityCreated
确保与Fragment相关联的Activity已经创建完毕时调用;
-
onDestroyView
当与Fragment关联的视图被移除时调用;
-
onDetach
当Fragment和Activity解除关联时调用;
Fragment的生命周期:
本文地址:https://blog.csdn.net/qq_40462579/article/details/107364214
上一篇: 李斯有哪些贡献?他最后是怎么死的?
下一篇: 测试1