我想在另一个片段上添加一个片段。但是在使用导航喷气背包时,似乎是替换片段而不是添加。我实际上想显示一个弹出页面,这样两个片段就可以互相交流,这似乎适用于旧的添加片段功能,但最近我们的项目已经被导航喷气背包所取代。
wdebmtf21#
其中一个选项是让你的第二个片段扩展DialogFragment,并将其作为<dialog>而不是<fragment>添加到导航图中。它将自动显示为导航组件的对话框。下面是一个示例:
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
bxgwgixi2#
这对我很有效-〉
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() } }
因此,我们可以添加一个对话框并向视图中添加一个侦听器,而不是添加片段并与之通信。
34gzjxbg3#
对话框-〉
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));
3条答案
按热度按时间wdebmtf21#
其中一个选项是让你的第二个片段扩展
DialogFragment
,并将其作为<dialog>
而不是<fragment>
添加到导航图中。它将自动显示为导航组件的对话框。下面是一个示例:
您可以使用全屏幕主题将此对话框设为全屏幕显示,或使用以下方法将其设为底部表单:
bxgwgixi2#
这对我很有效-〉
因此,我们可以添加一个对话框并向视图中添加一个侦听器,而不是添加片段并与之通信。
34gzjxbg3#
对话框-〉
导航-〉
主要片段-〉