如何使用导航喷气背包在另一个片段之上添加片段?



我想在另一个片段上添加一个片段。但是在使用导航喷气背包时,似乎替换片段而不是添加。

我实际上想显示一个弹出页面,以便两个片段可以相互通信,这似乎适用于旧的添加片段功能,但最近我们的项目已被导航喷气背包取代。

其中一个选项是使您的第二个片段扩展DialogFragment并将其作为<dialog>而不是<fragment>添加到导航图中。它将通过导航组件自动显示为对话框。

下面是一个示例:

<dialog
android:id="@+id/myPopupDialogFragment"
android:name="project.package.name.MyDialogFragment"
android:label="MyDialogFragment">
<!-- add arguments if you wish -->
</dialog>

您可以使用全屏主题或使用以下方法将此对话框作为底表显示:

Theme.MaterialComponents.Light.BottomSheetDialog

这对我有用->

fun ShowDialog()
{
//Inflate the dialog with custom view
val mDialogView = 
LayoutInflater.from(context).inflate(R.layout.layout_popup, null)

//AlertDialogBuilder
val mBuilder = AlertDialog.Builder(context)
.setView(mDialogView)
//show dialog
val alertDialog=mBuilder.show()
mDialogView.button_close.setOnClickListener {
alertDialog.dismiss()
}
mDialogView.button_submit.setOnClickListener {
viewModel.data.value="Data"
alertDialog.dismiss()
}
}

因此,我们可以添加一个对话框并向视图添加侦听器,而不是添加片段并与之通信。

对话框>

class ConfirmationDialogFragment : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val navController = NavHostFragment.findNavController(this)
val viewModelProvider =
ViewModelProvider(navController.getViewModelStoreOwner(R.id.nav_graph))
val vm = viewModelProvider.get(GraphViewModel::class.java)
return AlertDialog.Builder(requireActivity())
.setTitle(R.string.dialog_title)
.setMessage(R.string.dialog_message)
.setPositiveButton(R.string.dialog_positive) { _, _ -> vm.onAccept() }
.setNegativeButton(R.string.dialog_negative) { _, _ -> vm.onDecline() }
.setOnCancelListener { vm.onDecline() }
.create()
}

导航>

<?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/nav_graph"
app:startDestination="@id/mainFragment">
<fragment
android:id="@+id/mainFragment"
android:name="com.commonsware.jetpack.sampler.dialog.MainFragment"
android:label="MainFragment" >
<action
android:id="@+id/confirmNuke"
app:destination="@id/confirmationDialogFragment" />
</fragment>
<dialog
android:id="@+id/confirmationDialogFragment"
android:name="com.commonsware.jetpack.sampler.dialog.ConfirmationDialogFragment"
android:label="ConfirmationDialogFragment" />
</navigation>

主要片段>

binding.nuke.setOnClickListener(v ->
NavHostFragment.findNavController(MainFragment.this)
.navigate(R.id.confirmNuke));

相关内容

  • 没有找到相关文章