在下面,您可以看到我的第一个活动的导航图,其中包含一些片段(片段A,B和C): 这是此导航图的XML:
<?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"
app:startDestination="@id/fragmentA">
<fragment
android:id="@+id/fragmentA"
android:name="com.celik.abdullah.learningnavigation1.FragmentA"
android:label="FragmentA"
tools:layout="@layout/fragment_a">
<action
android:id="@+id/action_fragmentA_to_fragmentB"
app:destination="@id/fragmentB" />
</fragment>
<fragment
android:id="@+id/fragmentB"
android:name="com.celik.abdullah.learningnavigation1.FragmentB"
android:label="FragmentB"
tools:layout="@layout/fragment_b">
<action
android:id="@+id/action_fragmentB_to_fragmentC"
app:destination="@id/fragmentC"
app:popUpTo="@+id/fragmentB"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/fragmentC"
android:name="com.celik.abdullah.learningnavigation1.FragmentC"
android:label="FragmentC"
tools:layout="@layout/fragment_c">
<action
android:id="@+id/action_fragmentC_to_main2Activity"
app:destination="@id/main2Activity"
app:popUpTo="@+id/main2Activity"
app:popUpToInclusive="true" />
</fragment>
<activity
android:id="@+id/main2Activity"
android:name="com.celik.abdullah.learningnavigation1.Main2Activity"
android:label="Main2Activity" />
</navigation>
如您所见,在片段C中,有第二个主要活动的动作,其中包含另一组片段。为了完整起见,我还将向您显示该活动的导航图:
同样,这是第二个导航图的XML:
<?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/navigation2"
app:startDestination="@id/fragmentD">
<fragment
android:id="@+id/fragmentD"
android:name="com.celik.abdullah.learningnavigation1.FragmentD"
android:label="FragmentD"
tools:layout="@layout/fragment_d">
<action
android:id="@+id/action_fragmentD_to_fragmentE"
app:destination="@id/fragmentE"
app:popUpTo="@+id/fragmentD"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/fragmentE"
android:name="com.celik.abdullah.learningnavigation1.FragmentE"
android:label="FragmentE"
tools:layout="@layout/fragment_e"/>
</navigation>
当我在片段E中时,我想回到片段C。为此,我在片段E中具有以下代码:
binding.back.setOnClickListener{
Navigation.findNavController(requireActivity(), R.id.nav_host_fragment).navigateUp()
}
我在这里所做的是,当单击Fragment E
的后退按钮时,我找到了ID为nav_host_fragment
的第一个导航图的导航控制器,然后调用navigateUp()
。
由于具有popUpTo
和popUpToInclusive
属性,Fragment C
和Fragment D
不应放在堆栈中。因此,我认为从Fragment C
导航回Fragment E
可能是可行的。
但是这种方法行不通。该应用程序崩溃,但出现以下异常:
2020-03-01 13:00:28.695 16117-16117/com.celik.abdullah.learningnavigation1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.celik.abdullah.learningnavigation1, PID: 16117
java.lang.IllegalArgumentException: ID does not reference a View inside this Activity
at androidx.core.app.ActivityCompat.requireViewById(ActivityCompat.java:368)
at androidx.navigation.Navigation.findNavController(Navigation.java:58)
at com.celik.abdullah.learningnavigation1.FragmentE$onViewCreated$1.onClick(FragmentE.kt:39)
at android.view.View.performClick(View.java:6261)
at android.view.View$PerformClick.run(View.java:23748)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
有人为这种导航提供了一种解决方案-在两个图形之间来回导航吗?
注意:之所以要进行两个活动,是因为活动1和2的布局之间存在差异。活动1的布局具有底部导航菜单和导航抽屉,而活动2的布局则没有其中。
答案 0 :(得分:0)
在第二个活动中重写onBackPressed函数可以解决问题。
override fun onBackPressed()
{
moveTaskToBack(true)
}
这应该完成第二个活动,从而使您回到第一个活动。