问题描述
有一个 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 (将#修改为@)