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

У меня есть класс с именем AlertDialogFragment, который будет использоваться для создания диалогового окна с предупреждением при необходимости во всей моей программе.Фрагмент, который создает диалог, вызовет функцию, если нажата положительная кнопка, или ничего, если нажата отрицательная кнопка.Я довольно новичок в разработке Android и любые советы или помощь приветствуется.

Вот мой AlertDialogFragment:

class AlertDialogFragment : DialogFragment() {


    companion object {
        private val TAG = "AlertDialogFragment"


        fun newInstance(message: String, positiveBtnText: String, negativeBtnText: String): AlertDialogFragment {
            val fragment = AlertDialogFragment()
            fragment.isCancelable = false

            val args = Bundle()
            args.putString("aMessage", message)
            args.putString("aPositiveBtnText", positiveBtnText)
            args.putString("aNegativeBtnText", negativeBtnText)

            fragment.arguments = args
            return fragment
        }


    }


    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        Log.d(TAG, "onCreateDialog called")
        super.onCreateDialog(savedInstanceState)
        return activity?.let {
            val builder = AlertDialog.Builder(it)
            builder.setMessage(arguments?.getString("aMessage"))
                    .setPositiveButton(arguments?.getString("aPositiveBtnText"), DialogInterface.OnClickListener { dialog, id ->
                        Log.d(TAG, "Yes!")
                    })
                    .setNegativeButton(arguments?.getString("aNegativeBtnText"), DialogInterface.OnClickListener { dialog, id ->
                        Log.d(TAG, "Dismiss!")
                    })

            Log.d(TAG, "onCreateDialog ending")
            builder.create()
        } ?: throw IllegalStateException("Activity can not be null")
    }


} 

Вот моя попытка инициализировать диалоговое окно предупреждения и установить целевой фрагмент:

try {
            AlertDialogFragment alertDialogFragment = new AlertDialogFragment().Companion.newInstance(
                    "Would you like to continue?",
                    "Yes",
                    "Dismiss");
            alertDialogFragment.setTargetFragment(this, TARGET_FRAGMENT_REQUEST_CODE);
            alertDialogFragment.show(getActivity().getSupportFragmentManager(), "dialog");
        }catch (Exception e){
            e.printStackTrace();
        }

Заранее спасибо за любую помощь!

РЕДАКТИРОВАТЬ: Я использую kotlin для диалогового окна предупреждения и фрагмент, который его инициализирует, находится в Java.

1 Ответ

1 голос
/ 23 мая 2019

Вы можете получить целевой фрагмент и код запроса, который вы передали, а затем использовать его для вызова onActivityResult:

targetFragment?.let { fragment ->
    fragment.onActivityResult(fragment.targetRequestCode, Activity.RESULT_OK, null)
}

и в вашей функции:

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        Log.d(TAG, "onCreateDialog called")
        super.onCreateDialog(savedInstanceState)
        return activity?.let {
            val builder = AlertDialog.Builder(it)
            builder.setMessage(arguments?.getString("aMessage"))
                    .setPositiveButton(arguments?.getString("aPositiveBtnText"), DialogInterface.OnClickListener { dialog, id ->
                        Log.d(TAG, "Yes!")
                        targetFragment?.let { fragment ->
                            fragment.onActivityResult(fragment.targetRequestCode, Activity.RESULT_OK, null)
                        }
                    })
                    .setNegativeButton(arguments?.getString("aNegativeBtnText"), DialogInterface.OnClickListener { dialog, id ->
                        Log.d(TAG, "Dismiss!")
                    })

            Log.d(TAG, "onCreateDialog ending")
            builder.create()
        } ?: throw IllegalStateException("Activity can not be null")
    }

В вашемзапуская фрагмент, вы переопределяете onActivityResult и обрабатываете возвращенное значение.

Обратите внимание, что если ваш фрагмент воссоздан, вам придется переназначить целевой фрагмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...