android-fragments 如何使用导航喷气背包将碎片添加到另一个碎片上?

pdkcd3nj  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(129)

我想在另一个片段上添加一个片段。但是在使用导航喷气背包时,似乎是替换片段而不是添加。
我实际上想显示一个弹出页面,这样两个片段就可以互相交流,这似乎适用于旧的添加片段功能,但最近我们的项目已经被导航喷气背包所取代。

wdebmtf2

wdebmtf21#

其中一个选项是让你的第二个片段扩展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
bxgwgixi

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()
       }
   }

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

34gzjxbg

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));

相关问题