Я разрабатывал приложение, которое стало достаточно большим в коде, когда я заметил эту проблему, поэтому я сделал тестовое приложение, которое содержит нижнюю панель навигации с основным действием и тремя фрагментами (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), как фрагмент назначения начала, один действует как ожидалось, а фрагмент два показывает странное поведение,Я думаю, что проблема именно в начальном фрагменте назначения.