在Android Studio中使用导航时,为什么supportFragmentManager.findFragmentById无法返回当前的Fragment?

问题描述

一个 ActivityMain ,其中包含三个片段: FragmentHome FragmentDetail FragmentAbout ,以及一个导航xml。

FragmentHome 认片段,并且 FragmentDetail 用户界面和 FragmentAbout 用户界面中都有返回按钮。

当我在 FragmentAbout 用户界面中单击“上一步”按钮时,

FragmentAbout 将返回到 FragmentHome

问题1

我希望当我在 FragmentDetail 用户界面中单击 Back 按钮时显示一个提示窗口,如果我选择,它将返回到 FragmentHome “是”,如果我在提示窗口中选择“否”,它将保留在 FragmentDetail 用户界面中。

似乎supportFragmentManager.findFragmentById(R.id.fragment_navigation)无法返回FragmentDetail对象,因此当我在 FragmentDetail UI中单击“上一步”按钮时,提示窗口将永远不会显示,该如何解决有问题吗?

问题2

还有,如果使用导航xml,单击“后退”按钮时是否有更好的方式显示提示窗口?它将返回给了用户界面,当我在提示符窗口中选择“是”,它会在当前的UI保留,当我选择“否”。

ActivityMain.kt

class ActivityMain : AppCompatActivity() {

    private lateinit var binding: LayoutMainBinding
    private lateinit var appBarConfiguration: AppBarConfiguration
    private val navController: NavController by lazy{ findNavController(R.id.fragment_navigation)}

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this,R.layout.layout_main)

        setSupportActionBar(binding.toolbar)

        appBarConfiguration =  AppBarConfiguration.Builder(navController.graph).build()
        setupActionBarWithNavController(navController,appBarConfiguration)
    }

    override fun onSupportNavigateUp(): Boolean {
        val currentFrag = supportFragmentManager.findFragmentById(R.id.fragment_navigation) //It seems it can't return current fragment.

        if(currentFrag is FragmentDetail){                
            val builder = AlertDialog.Builder(this)
            builder.setTitle("Warning").setMessage("Do you want to back?")
            builder.apply {
                setPositiveButton(R.string.btnYes,DialogInterface.OnClickListener { dialog,id ->
                        navController.navigateUp(appBarConfiguration) ||  super.onSupportNavigateUp()
                    })
            }
            builder.apply {
                setNegativeButton(R.string.btnNo,id ->

                    })
            }            
            builder.create().show()

        } else{
            return navController.navigateUp(appBarConfiguration) ||
                    super.onSupportNavigateUp()
        }

        return true
    }
}

layout_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout 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">

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.google.android.material.appbar.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fitsSystemWindows="true">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?android:attr/actionBarSize"
                android:background="@color/colorPrimary"
                android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
            />
        </com.google.android.material.appbar.AppBarLayout>

        <fragment
            android:id="@+id/fragment_navigation"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            app:defaultNavHost="true"
            app:navGraph="@navigation/nav_graph" />

    </androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>

nav_graph.xml

<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/nav_graph"
    app:startDestination="@id/fragmentHome"
    >
     <fragment
         android:id="@+id/fragmentHome"
         android:name="info.dodata.voicerecorder.ui.FragmentHome"
         android:label="Voice Record" >
     </fragment>

     <fragment
         android:id="@+id/fragmentDetail"
         android:name="info.dodata.voicerecorder.ui.FragmentDetail"
         android:label="Detail" >  
     </fragment>

     <fragment
         android:id="@+id/fragmentAbout"
         android:name="info.dodata.voicerecorder.ui.FragmentAbout"
         android:label="About" >
     </fragment> 
</navigation>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...