Деятельность, вызывающая DialogFragment: диалог не всегда закрывается - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть Activity, которая вызывает DialogFragment, как это:

private fun showDeleteDetailDialog(itemView: View, categoryId: String, detailId: String) {
    val dialog = DeleteDetailDialogFragment.newInstance(categoryId, detailId)
    dialog.show(this@DetailsActivity.fragmentManager, "DeleteDetailDialog")
}

И это код для моего DialogFragment (щелчок по кнопке PositiveButton удаляет элемент в базе данных Firebase):

class DeleteDetailDialogFragment : DialogFragment() {

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    // Use the Builder class for convenient dialog construction
    val categoryId = arguments.getString(ARG_CATEGORY_ID)
    val detailId = arguments.getString(ARG_DETAIL_ID)
    val builder = AlertDialog.Builder(activity)
    builder.setMessage(R.string.delete_detail)
            .setPositiveButton(R.string.delete, { dialog, id ->
                deleteDetail(categoryId, detailId)
            })
            .setNegativeButton(R.string.cancel, { dialog, id ->
                // User cancelled the dialog
            })
    // Create the AlertDialog object and return it
    return builder.create()
}

private fun deleteDetail(categoryId: String, detailId: String) {
    // get the detail reference for the specified category
    val deleteRef = FirebaseDatabase.getInstance().getReference("details").child(categoryId).child(detailId)
    // remove detail
    deleteRef.removeValue()

    // get the reference for the specified favorite, identified by detailId
    val deleteFaveRef = FirebaseDatabase.getInstance().getReference("favorites").child(detailId)
    // remove favorite
    deleteFaveRef.removeValue()
}

companion object {
    private val ARG_CATEGORY_ID = "category_id"
    private val ARG_DETAIL_ID = "detail_id"

    fun newInstance(categoryId: String, detailId: String): DeleteDetailDialogFragment {
        val fragment = DeleteDetailDialogFragment()
        val args = Bundle()
        args.putString(ARG_CATEGORY_ID, categoryId)
        args.putString(ARG_DETAIL_ID, detailId)
        fragment.arguments = args
        return fragment
    }
}
}

Когда я вызываю диалог, появляется диалоговое окно. Когда я нажимаю кнопку Отмена (кнопка NegativeButton), диалоговое окно исчезает, как и ожидалось. Когда я нажимаю «Удалить» (PositiveButton), диалоговое окно снова исчезает, как и ожидалось.

НО, после успешного удаления, когда я снова вызываю диалог, нажатие кнопки Отмена не сразу закрывает диалоговое окно; вместо этого снова появляется диалоговое окно, которое исчезает только после второго нажатия кнопки «Удалить». Кажется, есть проблема с FragmentManager. Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Нет ничего плохого в коде выше! Удаление элемента в базе данных Firebase вызвало событие onDataChange в моем ValueEventListener, которое затем вызвало функцию updateUI. К сожалению, мои onItemTouchListener обработки onItemClick событий (например, моя инструкция remove () через DialogFragment) были помещены туда, что работало нормально, пока я не изменил данные в своей базе данных Firebase. Но удаление элемента вызвало цикл, который вызвал «ошибочное» поведение моего кода. Решение было перенести вызов my onItemTouchListener (который обрабатывает onItemClicks) из функции updateUI в раздел onCreate моего кода. Да, я кое-что узнал!

0 голосов
/ 30 апреля 2018

Вам следует позвонить

 getDialog().dismiss()

Примечание

Вам следует создать собственный диалог в DeleteDetailDialogFragment.

class DeleteDetailDialogFragment : DialogFragment() {

     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View?
    {
         val rootView = inflater.inflate(R.layout.your_layout, container,false)
         return rootView
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val dialog = super.onCreateDialog(savedInstanceState)
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
        return dialog
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...