Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NavController设备旋转后没有当前导航节点_Android_Android Fragments_Kotlin_Android Architecture Components - Fatal编程技术网

Android NavController设备旋转后没有当前导航节点

Android NavController设备旋转后没有当前导航节点,android,android-fragments,kotlin,android-architecture-components,Android,Android Fragments,Kotlin,Android Architecture Components,我正在制作应用程序,它支持不同的设备方向。导航由Android Jetpack的导航系统执行。横向方向的应用程序主屏幕如下所示。它是列表包装器片段(它是NavHostFragment,它被添加到fragment标记中的活动布局中),包装器包括列表片段(fragment)和细节片段(FrameLayout)。纵向方向类似(包装和列表在其中,详细信息可通过导航访问) 我的问题是,在我更改设备方向后,出现异常 java.lang.IllegalStateException:没有当前导航节点 我的布局

我正在制作应用程序,它支持不同的设备方向。导航由Android Jetpack的导航系统执行。横向方向的应用程序主屏幕如下所示。它是列表包装器片段(它是
NavHostFragment
,它被添加到
fragment
标记中的活动布局中),包装器包括列表片段(
fragment
)和细节片段(
FrameLayout
)。纵向方向类似(包装和列表在其中,详细信息可通过导航访问)

我的问题是,在我更改设备方向后,出现异常

java.lang.IllegalStateException:没有当前导航节点

我的布局的第一个版本使用模拟数据工作正常,在我向我的应用程序添加空间、新订单和更新订单片段后出现错误。遗憾的是,我无法更准确地定位错误的来源

列表包装器代码

class OrderListWrapperFragment : RxFragment() {

    private val disposable = CompositeDisposable()

    var selectedOrderId: Long = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val bundle = savedInstanceState ?: arguments
        bundle?.let {
            selectedOrderId = it.getLong(EXTRA_ORDER_ID)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(R.layout.orders__list_wrapper, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        initializeToolbar(toolbar, getString(R.string.orders_title), false)

        newOrderButton
            .clicks()
            .subscribe {
                findNavController()
                    .navigate(R.id.action_orderListWrapperFragment_to_orderNewFragment)
            }
            .addTo(disposable)

        childFragmentManager.registerFragmentLifecycleCallbacks(callback, false)
    }

    override fun onDestroyView() {
        super.onDestroyView()

        childFragmentManager.unregisterFragmentLifecycleCallbacks(callback)

        disposable.clear()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)

        outState.putLong(EXTRA_ORDER_ID, selectedOrderId)
    }

    private val callback = object : FragmentManager.FragmentLifecycleCallbacks() {

        private val disposable = CompositeDisposable()

        override fun onFragmentResumed(fm: FragmentManager, fragment: Fragment) {
            super.onFragmentResumed(fm, fragment)

            if (fragment is OrderListFragment) {
                fragment
                    .selectedItemIdChanges
                    .subscribeBy(onNext = {
                        selectedOrderId = it
                        if (orderDetailsContainer != null) {
                            childFragmentManager.commit {
                                replace(
                                    R.id.orderDetailsContainer,
                                    OrderDetailsFragment.newInstance(it)
                                )
                            }
                        } else {
                            findNavController()
                                .navigate(
                                    R.id.action_orderListWrapperFragment_to_orderDetailsFragment,
                                    bundleOf(EXTRA_ORDER_ID to it)
                                )
                            selectedOrderId = 0
                        }
                    },
                        onError = {
                            Log.d("detailView", it.toString())
                        })
                    .addTo(disposable)

                val orderId = selectedOrderId
                if (orderId != 0L) {
                    if (orderDetailsContainer != null) {
                        childFragmentManager.commit {
                            replace(
                                R.id.orderDetailsContainer,
                                OrderDetailsFragment.newInstance(orderId)
                            )
                        }
                    } else {
                        findNavController()
                            .navigate(//exception throws here
                                R.id.action_orderListWrapperFragment_to_orderDetailsFragment,
                                bundleOf(EXTRA_ORDER_ID to orderId)
                            )
                        selectedOrderId = 0
                    }
                }
            }
        }

        override fun onFragmentPaused(fm: FragmentManager, fragment: Fragment) {
            super.onFragmentPaused(fm, fragment)

            if (fragment is OrderListFragment) {
                disposable.clear()
            }
        }
    }

    companion object {
        private const val EXTRA_ORDER_ID = "EXTRA_ORDER_ID"
    }
}
我的导航图

<?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/navigation_graph"
    app:startDestination="@id/orderListWrapperFragment">

    <fragment
        android:id="@+id/orderListWrapperFragment"
        android:name="com.mtgshipping.app.orders.orderList.OrderListWrapperFragment"
        android:label="OrderListWrapperFragment"
        tools:layout="@layout/orders__list_wrapper">
        <action
            android:id="@+id/action_orderListWrapperFragment_to_orderDetailsFragment"
            app:destination="@id/orderDetailsFragment"/>
        <action
            android:id="@+id/action_orderListWrapperFragment_to_orderNewFragment"
            app:destination="@id/orderNewFragment"/>
        <action
            android:id="@+id/action_orderListWrapperFragment_to_orderUpdateFragment"
            app:destination="@id/orderUpdateFragment"/>
    </fragment>

    <fragment
        android:id="@+id/orderDetailsFragment"
        android:name="com.mtgshipping.app.orders.orderDetails.OrderDetailsFragment"
        android:label="OrderDetailsFragment"
        tools:layout="@layout/orders__order_details">
        <action
            android:id="@+id/action_orderDetailsFragment_to_orderUpdateFragment"
            app:destination="@id/orderUpdateFragment"/>
    </fragment>

    <fragment
        android:id="@+id/orderNewFragment"
        android:name="com.mtgshipping.app.orders.orderNew.OrderNewFragment"
        android:label="OrderNewFragment"
        tools:layout="@layout/orders__order_new">
        <action
            android:id="@+id/action_orderNewFragment_to_orderListWrapperFragment"
            app:destination="@id/orderListWrapperFragment"/>
    </fragment>

    <fragment
        android:id="@+id/orderUpdateFragment"
        android:name="com.mtgshipping.app.orders.orderUpdate.OrderUpdateFragment"
        android:label="OrderUpdateFragment"
        tools:layout="@layout/orders__order_update">
        <action
            android:id="@+id/action_orderUpdateFragment_to_orderListWrapperFragment"
            app:destination="@id/orderListWrapperFragment"/>
    </fragment>
</navigation>


我在
NavController
中进行了一些调试,它显示在第746行
NavDestination currentNode=mBackStack.isEmpty()?mGraph:mBackStack.getLast().getDestination()mGraph
null
,其他私有字段也为
null
。可能有什么东西阻止
NavController
正确初始化。如果需要,我可以提供布局和其他代码。

感谢斯拉夫的评论,他是对的。我将导航模块更新为2.2.0
navigation\u version='2.2.0'
应用程序的模块
build.gradle

implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"

执行此操作后,问题不再出现,看起来这是导航中的一个错误。

您也可以这样修复它。 在清单中的主机活动中添加此阿曲布他:

<activity android:name=".MainActivity"
        android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"


我的问题是生命周期依赖的版本

"androidx.lifecycle:lifecycle-extensions:$lifecycle_version
版本“2.2.0”由于出现问题,我返回使用“2.1.0”

lifecycle_version = '2.1.0'

这些解决方案都没有解决我的问题

我通过将嵌套图包含到主图中来修复它。

我有一个
nav_main
,其中包括一个
nav_sub_1

nav_sub_1
还包括另一个子图,
nav_sub_2

当我试图通过设置
nav_sub_2
来启动活动时,出现了
IllegalStateException

java.lang.IllegalStateException:没有当前导航节点

但通过设置
nav_main
nav_sub_1
不会发生这种情况

我的主图形
nav_main
如下所示:

<navigation
    <fragment...>
    <include app:graph="@navigation/nav_sub_1
<navigation/>
我在nav_main中加入了nav_sub_2,问题已经解决

<navigation
    <fragment...>
    <include app:graph="@navigation/nav_sub_1
    <include app:graph="@navigation/nav_sub_2
<navigation/>

I通过将导航组件更新到2.2.1版来修复导航。看到这个回答:这对我不起作用:(根据maven page的说法,最新的版本是1.0.0。你如何使用2.2.0版本?@IrvingLóp这是旧的软件包,我使用ktx版本这是我的问题,旧的依赖项。我认为这些“android.arch”依赖项被贬低为“androidx”我想如果您在构建中使用
android.useAndroidX=true
选项,那么您需要
androidx.navigation
而不是
android.arch.navigation
。从“android.arch”更改为“androidx”解决了我的问题,很多人感谢这很有帮助!我尝试按照上面的回答更新到2.2.0,但我也不得不从android.arch切换到androix。我正在寻找一些需要更新的google codelabs!也在你的项目构建中。gradle将依赖项类路径更改为
“androidx.navigation:navigation safe args gradle插件:$version\u navigation”
<navigation
    <fragment...>
    <include app:graph="@navigation/nav_sub_1
<navigation/>
<navigation
    <fragment...>
    <include app:graph="@navigation/nav_sub_2
<navigation/>
<navigation
    <fragment...>
    <include app:graph="@navigation/nav_sub_1
    <include app:graph="@navigation/nav_sub_2
<navigation/>