如何从BottomSheetFragmentDialog传递数据?

时间:2019-05-31 07:11:45

标签: android android-fragments kotlin android-dialogfragment bottom-sheet

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

这是我的片段对话框,将在我的片段中打开该对话框,并应保存正在单击的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()
    }
}
}

我就这样在片段中打开它,即使我知道它是不正确的。

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

    dialog.show(childFragmentManager, "BallTypeDialogFragment")
}

4 个答案:

答案 0 :(得分:0)

由于您使用的是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 :(得分:0)

1-创建一个界面。

interface DialogActivityContract{
  fun onPassDataRequsted(dataType: DataType)
}

2-实现与活动的接口:

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库。

答案 2 :(得分:0)

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

我在BottomSheetDialogFragment中用一个类的String变量创建了一个接口

 private var ballType: String = ""

interface OnBallGroupSelectedListener {
    fun onBalldGroupListener(ballType: String)
}

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

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

然后在我的父片段中,只需实现接口并创建将在接口中设置的String变量

 private var ballType: String? = ""

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

答案 3 :(得分:0)

您可以按以下方式使用侦听器

Sub import_tickets()

  Dim sERPFileName As String
  Dim wbERP As Workbook, wsERP As Worksheet
  Dim wbMain As Workbook, wsMain As Worksheet
  Dim r, startrow, lastrow As Long
  Dim ID
  Dim dictERP
  Set dictERP = CreateObject("Scripting.Dictionary")

  With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = False
    .Show
    sERPFileName = .SelectedItems(1)
  End With

  Application.ScreenUpdating = False

  ' process ERP workbook
  Set wbERP = Workbooks.Open(sERPFileName, , xlReadOnly)
  Set wsERP = wbERP.Sheets("Sheet1")
  startrow = 2 ' assume has header
  lastrow = wsERP.Cells(Rows.Count, "F").End(xlUp).Row

  For r = startrow To lastrow
   ID = wsERP.Range("F" & r).Value
   If dictERP.exists(ID) Then
     MsgBox "Duplicate ID (" & ID & ") found in " & sERPFileName
   Else
     dictERP.Add ID, r
   End If
  Next r

  ' process MAIN workbook
  Set wbMain = ThisWorkbook
  Set wsMain = wbMain.Sheets("RAPORT")
  startrow = 2 ' assume has header
  lastrow = wsMain.Cells(Rows.Count, "F").End(xlUp).Row

  For r = startrow To lastrow
   ID = wsMain.Range("F" & r).Value
   If dictERP.exists(ID) Then
     ' update
     wsERP.Rows(dictERP(ID)).Columns("A:AK").Copy wsMain.Range("A" & r)
     wsMain.Range("L" & r) = "Updated " & Now
     dictERP.Remove (ID)
   Else
     ' set col R = 0
     wsMain.Range("R" & r).Value = 0
     wsMain.Range("L" & r) = "No Change " & Now
   End If
  Next r

  ' add from ERP those not matched
  If dictERP.Count > 0 Then
    For Each ID In dictERP.keys
      r = dictERP(ID)
      lastrow = lastrow + 1
      wsERP.Rows(r).Columns("A:AK").Copy wsMain.Range("A" & lastrow)
      wsMain.Range("L" & lastrow) = "Added " & Now
    Next
  End If

  wbERP.Close
  Application.ScreenUpdating = True

  If dictERP.Count Then
    MsgBox dictERP.Count & " rows added"
  Else
    MsgBox "Done"
  End If
End Sub

然后在调用片段中。

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