簡體   English   中英

使用導航組件向后導航

[英]Navigating back with the Navigation Component

在下面,您可以看到我托管一些片段(片段 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() 由於popUpTopopUpToInclusive屬性, Fragment CFragment D不應在堆棧上。 所以,我認為從Fragment E導航回Fragment C可能會奏效。

但這種方法行不通。 該應用程序崩潰,但出現以下異常:

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 的布局沒有它們。

在您的第二個活動中覆蓋 onBackPressed 函數可能會起作用。

override fun onBackPressed()
{
    moveTaskToBack(true)
}

這應該完成第二個活動,從而使您回到第一個活動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM