如何从 BottomSheetFragmentDialog 传递数据?

How to pass data from BottomSheetFragmentDialog?

问题是如何将数据从 BottomSheetDialogFragment 传递到 Fragment 或 Activity,正确的方法是什么?

这是我的 Fragment 对话框,它将在我的 Frament 中打开,并且应该保存来自被点击的 textview 的数据。

class BallTypeDialogFragment : BottomSheetDialogFragment() {

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) =
    inflater.inflate(R.layout.fragment_blood_type_dialog, container, false)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)


    text_view_ball_O.setOnClickListener {
        text_view_ball_O.text
        Toast.makeText(context, "O+", Toast.LENGTH_SHORT).show()
    }
    text_view_ball_A.setOnClickListener {
        text_view_ball_A.text
        Toast.makeText(context, "A+", Toast.LENGTH_SHORT).show()
    }
    text_view_ball_AA.setOnClickListener {
        Toast.makeText(context, "AA+", Toast.LENGTH_SHORT).show()
    }
    text_view_blood_grop_minus.setOnClickListener {
        text_view_blood_grop_minus.text
        Toast.makeText(context, "-", Toast.LENGTH_SHORT).show()
    }
    text_view_ball_AAR.setOnClickListener {
        text_view_ball_AAR.text
        Toast.makeText(context, "R -", Toast.LENGTH_SHORT).show()
    }
    text_view_ball_AARS.setOnClickListener {
        text_view_ball_AARS.text
        Toast.makeText(context, "AARS -", Toast.LENGTH_SHORT).show()
    }
    text_view_ball_OO.setOnClickListener {
        text_view_ball_OO.text
        Toast.makeText(context, "OO -", Toast.LENGTH_SHORT).show()
    }
}
}

而且我只是像这样在我的 Fragment 中打开它,尽管我知道它是不正确的。

 private fun showDialog() {
    val dialog = BallTypeDialogFragment()

    dialog.show(childFragmentManager, "BallTypeDialogFragment")
}

由于您使用的是 kotlin,您可能会考虑将 lambda 传递给您的 dialogfragment。

例如 BallTypeDialogFragment(onData: (String) -> Unit)

然后你路过

private fun showDialog(onData: (String) -> Unit)) {
    val dialog = BallTypeDialogFragment(onData)

    dialog.show(childFragmentManager, "BallTypeDialogFragment")
}

然后在您的 DialogFragment 中,您只需执行以下操作:

//something something
text_view_ball_O.setOnClickListener {
        onData(text_view_ball_O.text)
        Toast.makeText(context, "O+", Toast.LENGTH_SHORT).show()
    }
//something something

1- 创建接口。

interface DialogActivityContract{
  fun onPassDataRequsted(dataType: DataType)
}

2- 实现 activity 的接口:

class ActivityThatHoldsTheDialogActivity : SomeAppCompactActivity(),DialogActivityContract{


//other methods here

override public void onPassDataRequsted(DataType dataType){
//handle data here
    }
}

在你的片段中:

lateinit var dialogActivityContract: DialogActivityContract

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    dialogActivityContract = (activity as ActivityThatHoldsTheDialogActivity)


}

// some methods here 

fun whenYouNeedToSendThatData(){
 dialogActivityContract.onPassDataRequsted(yourData)
}

另一种方法是使用 EventBus 库。

这就是我解决问题的方法。

我在 BottomSheetDialogFragment 中为 class

创建了一个带有字符串变量的界面
 private var ballType: String = ""

interface OnBallGroupSelectedListener {
    fun onBalldGroupListener(ballType: String)
}

当我在对话框中选择值时,我将值设置为一个字符串,然后使用方法将值传递给我的父片段。

  private fun getBloodGroupResults() {
    val listener = targetFragment as OnBallGroupSelectedListener?
    listener?.onBalldGroupListener(ballType)
    dismiss()
}

然后在我的父 Fragment 中简单地实现接口并创建将在接口中设置的字符串变量

 private var ballType: String? = ""

override fun onBallGroupListener(ballType: String) {
    this.ballType = ballType
}

您可以如下使用监听器

open class BallTypeDialogFragment<L: BallTypeDialogFragment.BottomSheetClickListener.SingleAction> : BottomSheetDialogFragment(){

    open fun showWithListener(listener: L, fm : FragmentManager, tag : String) {
         this.listener = listener
         show(fm, tag)
     }

    interface BottomSheetClickListener {

    interface SingleAction : BottomSheetClickListener {
          fun passData(ballType: String)
    }
   }
  }
}

然后在调用的Fragment中


activity?.supportFragmentManager?.let {
            BallTypeDialog<LocationBottomSheet.BottomSheetClickListener.SingleAction>().showWithListener(object : BallTypeDialogFragment.BottomSheetClickListener.SingleAction {
               override fun passData(data : String)
            }, it, "test" )
        }