DataBindingUtil плюс NavHostFragment назад навигация не работает - PullRequest
0 голосов
/ 30 апреля 2019

Ранее я уже публиковал вопрос о том, что NavHostFragment не работает при обратном нажатии. На этот вопрос никто не ответил, поэтому, потратив на это пару дней усилий, мне наконец удалось выяснить проблему (я только добавляю новый код, отсутствующий в предыдущем вопросе, и изменил код здесь, чтобы уменьшить длину вопроса)

График навигации изменен на следующий:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools" android:id="@+id/launch_navigation_graph"
            app:startDestination="@id/splashFragment">

    <fragment android:id="@+id/splashFragment" android:name="com.myapp.android.SplashFragment"
              android:label="fragment_splash" tools:layout="@layout/fragment_splash">
        <action android:id="@+id/action_splashFragment_to_fragment1"
                app:destination="@id/fragment1"
        app:popUpTo="@+id/splashFragment"
                app:popUpToInclusive="true"/>
    </fragment>
    <fragment android:id="@+id/fragment1"
              android:name="com.myapp.android.Fragment1"
              android:label="fragment1" tools:layout="@layout/fragment_register_msisdn">
        <action android:id="@+id/action_fragment1_to_fragment2"
                app:destination="@id/fragment2" app:popUpTo="@+id/fragment1"
                app:popUpToInclusive="false"/>
    </fragment>
    <fragment android:id="@+id/fragment2"
              android:name="com.myapp.android.Fragment2"
              android:label="fragment_fragment2" tools:layout="@layout/fragment_fragment2"/>
</navigation>

Некоторая информация, которая отсутствовала в предыдущем вопросе. Привязка фрагмента ранее была сделана так (код ниже для Fragment1, то же самое сделано для Fragment2):

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding: Fragment1Binding =
        DataBindingUtil.setContentView(activity!!, R.layout.fragment1)
    binding.lifecycleOwner = this
    val fragment1ViewModel = ViewModelProviders.of(this).get(Fragment1ViewModel::class.java)
    binding.viewModel = fragment1ViewModel
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment1, container, false)
}

Приведенный выше код с графиком навигации теперь не падает, но кнопка «назад» просто отказывается работать. Это не всплывающий фрагмент, просто выйдите при втором нажатии.

Теперь я понял, что раздувание пользовательского интерфейса с помощью DataBindingUtil.setContentView стало причиной того, что мой код не работал. Я понял это, создав пошаговый проект еще одного примера, пока не понял, когда он перестанет работать. Я заставил пример проекта работать, используя привязку данных, используя DataBindingUtil для привязки для просмотра завышенного в OnCreateView, как показано ниже. Я удаляю переопределение oncreate.

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val rootView = inflater.inflate(R.layout.fragment1, container, false)
    val binding = DataBindingUtil.bind<Fragment1Binding>(rootView)
    binding?.lifecycleOwner = viewLifecycleOwner
    val fragment1ViewModel = ViewModelProviders.of(this).get(Fragment1ViewModel::class.java)
    binding.viewModel = fragment1ViewModel
    return rootView
}

Теперь этот код работает в примере проекта, но когда я помещаю его в свой окончательный проект (В примере проекта я просто помещаю кнопки и нажимаю, чтобы перейти туда, где, как и в моем исходном проекте, у меня есть вызовы веб-службы, и посмотреть, как модель наблюдает за навигации), вышеуказанный код вылетает со следующим исключением при нажатии назад из Fragment2 (аналогичный сбой в Fragment1, также как при нажатии назад из Fragment1).

2019-04-30 14:00:47.043 18087-18087/com.selfcare.safaricom E/InputEventSender: Exception dispatching finished signal.
2019-04-30 14:00:47.043 18087-18087/com.selfcare.safaricom E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
2019-04-30 14:00:47.047 18087-18087/com.selfcare.safaricom E/MessageQueue-JNI: java.lang.IllegalArgumentException: navigation destination com.selfcare.safaricom:id/action_fragment1_to_fragment2 is unknown to this NavController
        at androidx.navigation.NavController.navigate(NavController.java:803)
        at androidx.navigation.NavController.navigate(NavController.java:744)
        at androidx.navigation.NavController.navigate(NavController.java:730)
        at androidx.navigation.NavController.navigate(NavController.java:718)
        at com.myapp.android.Fragment2.handleLaunchStatus(Fragment2.kt:53)
        at com.myapp.android.Fragment2.access$handleLaunchStatus(Fragment2.kt:18)
        at com.myapp.android.Fragment2$attachLaunchObserver$1.onChanged(Fragment2.kt:46)
        at com.myapp.android.Fragment2$attachLaunchObserver$1.onChanged(Fragment2.kt:18)
        at androidx.lifecycle.LiveData.considerNotify(LiveData.java:113)
        at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:126)
        at androidx.lifecycle.LiveData$ObserverWrapper.activeStateChanged(LiveData.java:424)
        at androidx.lifecycle.LiveData$LifecycleBoundObserver.onStateChanged(LiveData.java:376)
        at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:361)
        at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.java:188)
        at androidx.lifecycle.LiveData.observe(LiveData.java:185)
        at com.myapp.android.Fragment2.attachLaunchObserver(Fragment2.kt:45)
        at com.myapp.android.Fragment2.onViewCreated(Fragment2.kt:37)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:895)
        at androidx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManagerImpl.java:2092)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1866)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1822)
        at androidx.fragment.app.FragmentManagerImpl.popBackStackImmediate(FragmentManagerImpl.java:298)
        at androidx.fragment.app.FragmentManagerImpl.popBackStackImmediate(FragmentManagerImpl.java:241)
        at androidx.fragment.app.FragmentManagerImpl.popBackStackImmediate(FragmentManagerImpl.java:288)
        at androidx.fragment.app.FragmentManagerImpl.popBackStackImmediate(FragmentManagerImpl.java:241)
        at androidx.fragment.app.FragmentActivity$1.handleOnBackPressed(FragmentActivity.java:144)
        at androidx.activity.OnBackPressedDispatcher.onBackPressed(OnBackPressedDispatcher.java:136)
        at androidx.activity.ComponentActivity.onBackPressed(ComponentActivity.java:283)
        at android.app.Activity.onKeyUp(Activity.java:3083)
        at android.view.KeyEvent.dispatch(KeyEvent.java:2716)
        at android.app.Activity.dispatchKeyEvent(Activity.java:3366)
        at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:80)
        at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:84)
        at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:98)
        at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:558)
        at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
        at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:2736)
        at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:342)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5037)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4905)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)
        at android.view.ViewRootImpl$InputStage.apply(Vie

Я гуглил с исключением, но не нашел ничего полезного в этом конкретном контексте, которое могло бы решить мою проблему. Пожалуйста, помогите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...