那么让我们来详细讲解一下“Android中Fragment的生命周期与返回栈的管理”的完整攻略。
什么是Fragment
Fragment是Android系统中重要的UI组件,它可以看做是一个子Activity,被设计成可嵌入在Activity中的组件。和Activity一样,Fragment也有自己的生命周期,包括onCreate、onCreateView、onResume等方法。并且,一个Activity可以同时包含多个Fragment。
Fragment的生命周期
Fragment的生命周期包含以下几种状态:
- 初始化(Instantiation):创建Fragment实例,即调用构造器。
- 加载(onAttach):Fragment依附到Activity上,此时可以通过getActivity()方法获取Activity实例。
- 创建(onCreate):Fragment正在创建,可以通过savedInstanceState获取之前保存的状态。
- 填充(onCreateView):创建或者加载Fragment对应的View。
- 就绪(onViewCreated):View创建完成,可以在该方法中进行findViewById等View操作。
- 开始(onStart):Fragment开始运行。
- 暂停(onPause):Fragment暂停。
- 停止(onStop):Fragment停止运行。
- 销毁(onDestroyView):清理View资源。
- 销毁(onDestroy):清理Fragment资源。
- 分离(onDetach):Fragment与Activity分离。
返回栈的管理
在Activity中,我们可以通过Intent来进行Activity之间的跳转,从而实现Activity栈的管理;而在Fragment中,我们常常需要使用FragmentManager来管理Fragment栈。
FragmentManager提供了以下几个常用的方法:
- add(int containerViewId, Fragment fragment, String tag):添加一个Fragment到栈中。
- remove(Fragment fragment):从栈中移除一个Fragment。
- findFragmentById(int fragmentId):通过ID查找一个Fragment。
- popBackStack():出栈一个Fragment。
- popBackStackImmediate():立即出栈一个Fragment。
此外,FragmentManager还提供了一些其他的方法,例如beginTransaction、commit等来对Fragment进行管理。
示例说明
我们来考虑以下两个使用示例:
示例1
在Activity中,我们添加了一个按钮,点击按钮会添加一个Fragment(对应的布局文件为fragment_test)到栈中:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.btn_add);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment testFragment = new TestFragment();
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_container, testFragment, "TEST")
.addToBackStack("TEST")
.commit();
}
});
}
}
在Fragment中,我们重写了生命周期方法,并添加了打印信息的代码,方便我们观察生命周期的变化:
public class TestFragment extends Fragment {
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.d("TestFragment", "onAttach");
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TestFragment", "onCreate");
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.d("TestFragment", "onCreateView");
return inflater.inflate(R.layout.fragment_test, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.d("TestFragment", "onViewCreated");
}
@Override
public void onResume() {
super.onResume();
Log.d("TestFragment", "onResume");
}
@Override
public void onPause() {
super.onPause();
Log.d("TestFragment", "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d("TestFragment", "onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d("TestFragment", "onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("TestFragment", "onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.d("TestFragment", "onDetach");
}
}
此时,我们运行代码,并点击按钮添加Fragment后,可以观察到生命周期变化的日志信息:
onAttach
onCreate
onCreateView
onViewCreated
onResume
随后,我们点击返回按钮,将Fragment出栈。此时的日志信息如下:
onPause
onStop
onDestroyView
onDestroy
onDetach
示例2
在Activity中,我们添加了两个按钮,分别用于添加不同的Fragment(对应的布局文件为fragment_test1和fragment_test2)。其中,第一个Fragment添加时不加入返回栈,而第二个Fragment添加时加入返回栈。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = findViewById(R.id.btn_add1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment testFragment = new TestFragment1();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, testFragment, "TEST1")
.commit();
}
});
Button button2 = findViewById(R.id.btn_add2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment testFragment = new TestFragment2();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, testFragment, "TEST2")
.addToBackStack("TEST2")
.commit();
}
});
}
}
与上一个示例类似,我们同样重写了生命周期方法,并添加了打印信息的代码:
public class TestFragment1 extends Fragment {
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.d("TestFragment1", "onAttach");
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TestFragment1", "onCreate");
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.d("TestFragment1", "onCreateView");
return inflater.inflate(R.layout.fragment_test1, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.d("TestFragment1", "onViewCreated");
}
@Override
public void onResume() {
super.onResume();
Log.d("TestFragment1", "onResume");
}
@Override
public void onPause() {
super.onPause();
Log.d("TestFragment1", "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d("TestFragment1", "onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d("TestFragment1", "onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("TestFragment1", "onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.d("TestFragment1", "onDetach");
}
}
public class TestFragment2 extends Fragment {
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.d("TestFragment2", "onAttach");
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TestFragment2", "onCreate");
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.d("TestFragment2", "onCreateView");
return inflater.inflate(R.layout.fragment_test2, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.d("TestFragment2", "onViewCreated");
}
@Override
public void onResume() {
super.onResume();
Log.d("TestFragment2", "onResume");
}
@Override
public void onPause() {
super.onPause();
Log.d("TestFragment2", "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d("TestFragment2", "onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d("TestFragment2", "onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("TestFragment2", "onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.d("TestFragment2", "onDetach");
}
}
此时,我们运行代码,并先点击第一个按钮添加Fragment1,再点击第二个按钮添加Fragment2。随后,我们点击返回按钮,将Fragment2出栈,然后观察Fragment1的日志信息:
onAttach
onCreate
onCreateView
onViewCreated
onResume
可以发现,即使将Fragment2出栈,Fragment1的生命周期依然会继续。而如果我们此时再次点击返回按钮,将Fragment1出栈,就可以看到Fragment1的完整生命周期:
onPause
onStop
onDestroyView
onDestroy
onDetach
至此,关于Fragment的生命周期与返回栈的管理的攻略就讲解完了,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android中Fragment的生命周期与返回栈的管理 - Python技术站