为什么当我第二次在Android Studio中使用导航启动动作时,导航目的地丢失了?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么当我第二次在Android Studio中使用导航启动动作时,导航目的地丢失了?相关的知识,希望对你有一定的参考价值。

我在项目中使用导航。

[图像1将在应用程序启动时显示,在图像1中单击下一步按钮,将显示图像2,然后在图像2中单击返回按钮,将再次显示图像1。

现在,我再次单击图像1中的“下一步”按钮,应用程序崩溃,出现错误'此NavController未知的导航目标com.example.myapplication:id / actionTwo,'>>,为什么?

为什么NavHostFragment.findNavController(this).navigate(OneFrDirections.actionTwo())无法第二次启动?

您可以在https://www.dropbox.com/s/1ad47eqi4iwig5v/MyNAV.zip?dl=0下载测试代码

my.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"
    android:id="@+id/my"
    app:startDestination="@+id/One">

    <fragment
        android:id="@+id/One"
        android:name="com.example.myapplication.OneFr"
        android:label="One">

        <action
            android:id="@+id/actionTwo"
            app:destination="@id/Two" />

    </fragment>

    <fragment
        android:id="@+id/Two"
        android:name="com.example.myapplication.TwoFr"
        android:label="Two">

        <action
            android:id="@+id/actionOne"
            app:destination="@id/One" />
    </fragment>

</navigation>

OneFr.kt

class OneFr : Fragment() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)

    

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


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

         view.findViewById<Button>(R.id.btnNext).setOnClickListener 
            NavHostFragment.findNavController(this).navigate(OneFrDirections.actionTwo())
        

    


TwoFr.kt

class TwoFr : Fragment() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
    

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


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

        // Handle back button press
        view.findViewById<Button>(R.id.btnBack).setOnClickListener 
            fragmentManager?.popBackStack()
        

    


one.xml

<androidx.constraintlayout.widget.ConstraintLayout
    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:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btnNext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Next"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

two.xml

<androidx.constraintlayout.widget.ConstraintLayout
    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:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btnBack"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Back"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_main.xml

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/fragment_container"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/my" />

</FrameLayout>

MainActivity.kt

class MainActivity : AppCompatActivity() 

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    

图像1

enter image description here

图像2

enter image description here

我在项目中使用导航。应用启动时将显示图像1,单击图像1中的“下一步”按钮,将显示图像2,然后单击图像2中的“后退”按钮,图像1将...

答案

代替fragmentManager?.popBackStack(),尝试

以上是关于为什么当我第二次在Android Studio中使用导航启动动作时,导航目的地丢失了?的主要内容,如果未能解决你的问题,请参考以下文章

核心图像过滤器的输出图像第二次在 UIImage 上运行时为零

当我第二次实例化预制件时,为啥会出现错误?

当我第二次设置它的 ItemsSource 时,为啥这个选择器会崩溃?

为啥当我第二次使用完全相同的参数调用 IMMUTABLE 函数时,计划时间会加倍?

Android Studio getActionBar() 返回 null?

当我第二次关注 Textview 时,文本在 textView 中向上移动