Как передать данные из BottomSheetFragmentDialog? - PullRequest
0 голосов
/ 31 мая 2019

Вопрос в том, как передать данные из BottomSheetDialogFragment во Fragment или Activity и что будет правильным способом?

Вот мое диалоговое окно «Фрагмент», которое будет открыто в моем «Фрагменте» и должно сохранять данные из текстового представления, по которому щелкают.

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

Ответы [ 3 ]

0 голосов
/ 31 мая 2019

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 .

0 голосов
/ 02 июня 2019

Так вот как я решил проблему.

Я создал интерфейс в своем 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
}
0 голосов
/ 31 мая 2019

Поскольку вы используете kotlin, вы можете рассмотреть возможность передачи лямбда-выражения в свой фрагмент диалога.

например. 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

...