雪落的小屋

Android-Fragment学习

2022-09-14学习笔记Android编程

前段时间学完了Android 四大组件,写的 Demo App 基本都是直接用 Activity,后面看别人的 APP 大部分都是用的 Fragment ,这样效率高,界面切换也快,所以学习记录一下。

Fragment 概要

Fragment 在 XML 中必须要有 idtag ,例如:

其中,android:name 是指向的该 Fragment 对应的类名

<androidx.fragment.app.FragmentContainerView
      android:id="@+id/fragment_test"
	  android:name="com.example.learn_825.TestFragment"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

官方说明:

This <fragment> tag should specify an id or a tag to preserve state across activity restarts

Fragment 创建

创建的时候最好判断一下 view 是否存在,存在就拿过来用,避免重复创建浪费系统资源

private View rootView;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    if (rootView == null) {
        rootView = inflater.inflate(R.layout.fragment_test, container, false);
    }
    return rootView;
}

Fragment 切换

如果要进行简单的 Fragment 的切换的话,下面是代码例子:

replace会使被替换的 Fragment 销毁,所以会触发 onDestoryView() 的生命周期

private void replaceFragment(Fragment fragment) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.fragment_test, fragment);// 第一个参数是Fragment容器的id,第二个参数是要替换的fragment
    fragmentTransaction.addToBackStack(null);// 加入回退栈,返回时可以返回到上一个Fragment而不是直接退出Activity
    fragmentTransaction.commit();// 事务提交
}

通过 Bundle 传递数据

// Activity
Bundle bundle = new Bundle();
bundle.putString("Rin", "哈哈哈哈哈");
TestFragment testFragment = new TestFragment();
testFragment.setArguments(bundle);
replaceFragment(testFragment);
// Fragment OnCreate
String message = getArguments().getString("Rin");
Log.d(TAG, "Message: " + message);
Toast.makeText(getContext(), "收到Bundle的信息:" + message, Toast.LENGTH_SHORT).show();

Fragment 生命周期

1、打开界面

graph LR;
	onCreate["onCreate()"] --> onCreateView["onCreateView()"] --> onActivityCreated["onActivityCreated()"] --> onStart["onStart()"] --> onResume["onResume()"];
	

2、按下Home键

graph LR;
	onPause["onPause()"] --> onStop["onStop()"];

3、重新打开界面

graph LR;
	onStart["onStart()"] --> onResume["onResume()"];

4、按后退键

graph LR;
	onPause["onPause()"] --> onStop["onStop()"] --> onDestoryView["onDestoryView()"] --> onDestory["onDestory()"] --> onDetach["onDetach()"]