当我注意到这个问题时,我正在开发一个代码变得相当大的应用程序,所以我制作了一个测试应用程序,其中包含一个底部导航栏,其中包含主要活动和三个片段(F1、F2、F3)并使用导航组件进行设置。我记录了第一个片段的生命周期事件,如下所示,这就是我得到的:
public class F1 extends Fragment {
private OnFragmentInteractionListener mListener;
private static final String TAG = "F1";
public F1() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate: ");
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated: ");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach: ");
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume: ");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop: ");
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
Log.d(TAG, "onCreateView: ");
return inflater.inflate(R.layout.fragment_f1, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.d(TAG, "onViewCreated: ");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView: ");
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
从 f1 导航到 f2 时,logcat:
2019-09-22 14:11:34.648 6580-6580/com.example.navtest D/F1: onStop:
2019-09-22 14:11:34.648 6580-6580/com.example.navtest D/F1: onDestroyView:
使用导航栏从 f2 导航回 f1 时:
2019-09-22 14:12:41.406 6580-6580/com.example.navtest D/F1: onCreate:
2019-09-22 14:12:41.406 6580-6580/com.example.navtest D/F1: onCreateView:
2019-09-22 14:12:41.408 6580-6580/com.example.navtest D/F1: onViewCreated:
2019-09-22 14:12:41.408 6580-6580/com.example.navtest D/F1: onActivityCreated:
2019-09-22 14:12:41.408 6580-6580/com.example.navtest D/F1: onStart:
2019-09-22 14:12:41.408 6580-6580/com.example.navtest D/F1: onResume:
2019-09-22 14:12:41.410 6580-6580/com.example.navtest D/F1: onDestroy:
2019-09-22 14:12:41.410 6580-6580/com.example.navtest D/F1: onDetach:
有人可以解释一下这种行为吗?应用程序正常工作,片段可见且功能正常,那么为什么要调用 onDestory/onDetach?可能是错误还是什么?我在这两个项目中都有它,它们之间的共同点是我如何在主要活动中设置底部应用程序栏,这是正常的方式,但无论如何我都会发布它:
NavController navController = Navigation.findNavController(this, R.id.navHostFragment);
BottomNavigationView appBar = findViewById(R.id.appBar);
NavigationUI.setupWithNavController(appBar, navController);
编辑: 上面测试的片段一是起始目的地,记录片段二一切似乎正常,只有当我分配它(片段2)时,起始目的地片段一按预期运行,片段二显示奇怪的行为。我认为这个问题专门针对起始目标片段。