Навигационный компонент, не имеет набора NavController , не имеет NavController, установленного в androidx.navigation.Navigation.findNavController

#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:

Два способа получить навигационный контроллер из фрагмента:

  1. NavHostFragment.findNavController(this);

  2. 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