问题是如何将数据从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")
}
答案 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)
}
}
}
}