#android #android-studio #android-architecture-navigation #android-navigation
#Android #android-studio #android-архитектура-навигация #android-навигация
Вопрос:
Я в основном пытаюсь перейти к другому фрагменту после ожидания 5 секунд.Когда я выполняю процесс навигации в моем onViewCreated, он работает, но когда я делаю это в onFinish, он выдает ошибку ниже.
Я пытался сохранить объект View в качестве глобальной переменной, но это тоже не сработало.
E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.example.ui, PID: 17838 java.lang.Исключение IllegalStateException: просмотр androidx.constraintlayout.виджет.ConstraintLayout{8dcd038 V.E…… ……. D 0,0-1080,1908} не имеет NavController, установленного в androidx.navigation.Navigation.findNavController(Navigation.java:84) в com.example.ui.sign_in.LoadingFragment $ 1.onFinish(LoadingFragment.java:39) в android.os.CountDownTimer $ 1.handleMessage(CountDownTimer.java: 127) в android.os.Handler.DispatchMessage(Handler.java: 106) в android.os.Looper.loop(Looper.java: 201) вandroid.app.ActivityThread.main(ActivityThread.java:6810) в java.lang.reflect.Метод.invoke(собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873) Ввод / вывод: отправка сигнала. PID: 17838 СИГНАЛ: 9
** частный вид просмотра;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_loading, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
this.view = view;
new CountDownTimer(5000, 1000) { //Wait 5 seconds
public void onTick(long millisUntilFinished) {
}
public void onFinish() { // Then navigate to other page.
navigate();
}
}.start();
super.onViewCreated(view, savedInstanceState);
}
private void navigate() {
Navigation.findNavController(this.view).navigate(LoadingFragmentDirections.actionLoadingFragmentToSignInPagerFragment());
}**
Ответ №1:
Решение 1)
Вам нужно проверить, виден ли фрагмент или нет, прежде onFinish()
чем вызывать
Добавьте логическое значение, инициализируйте его onResume()
и сделайте его false следующим onPause()
образом
private boolean isFragmentVisible=false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_loading, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
this.view = view;
new CountDownTimer(5000, 1000) { //Wait 5 seconds
public void onTick(long millisUntilFinished) {
}
public void onFinish() { // Then navigate to other page.
//check if fragment is visible or not
if(isFragmentVisible){
navigate();
}
}
}.start();
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
isFragmentVisible=true;
}
@Override
public void onPause() {
super.onPause();
isFragmentVisible=false;
}
private void navigate() {
Navigation.findNavController(this.view).navigate(LoadingFragmentDirections.actionLoadingFragmentToSignInPagerFragment());
}**
Решение 2)
Вам нужно объявить экземпляр CountDownTimer и инициализировать его один раз и сделать его нулевым, когда фрагмент больше не виден
Ответ №2:
Два способа получить навигационный контроллер из фрагмента:
-
NavHostFragment.findNavController(this);
-
Navigation.findNavController(requireActivity(), R.id.MAIN_NAV_HOST_FRAGMENT);
Ответ №3:
Я не уверен, работает ли это для вас, но у меня был такой похожий случай проблемы, когда я заметил, что объект view уничтожается. Поэтому он сохраняет его по-своему 🙂
Эта переменная объявлена в переменных-членах класса MyExampleFragment
private View mFragView;
Внутри onCreateView я просто добавляю нулевую проверку, чтобы она не создавалась снова.
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (mFragView != null) {
return mFragView;
}
mFragView = inflater.inflate(R.layout.fragment_dashboard, container, false);
ButterKnife.bind(this, mFragView);
return mFragView;
}
Ответ №4:
я меняю свой код:
val action =
StartFragmentDirections.actionStartFragmentToLoginFragment()
Navigation.findNavController(view).navigate(action);
для onViewCreated