为AlertDialog NegativeButton侦听器传递函数

问题描述 投票:0回答:1

每当显示AlertDialog框的否定按钮时,都希望传递一个函数来执行。我创建了一个实用程序函数来显示错误:

fun Context.showError(message: String, negativeLabel: Int = R.string.modal_action_dismiss, negativeAction: (() -> Unit)? = null, positiveAction: (() -> Unit)? = null, positiveLabel: Int? = null) {
    val builder = AlertDialog.Builder(this)
    builder.setMessage(message)
    builder.setNegativeButton(negativeLabel) { dialog, _ ->
        dialog.dismiss()
        negativeAction
    }
    // Set positive action only if it exists
    if (positiveAction != null && positiveLabel != null) {
        builder.setPositiveButton(positiveLabel) { dialog, _ ->
            dialog.dismiss()
            positiveAction
        }
    }
    builder.create().show()
}

当我这样调用它时,此功能运行良好:

context?.showError(R.string.modal_action_back) {
    activity?.onBackPressed()
}

但是,我正在viewPager中显示的片段中使用它,希望“负”按钮触发将页面移至viewPager中的上一页,而“正”按钮触发触发移至视图分页器中的下一页:

ViewPagerFragment

class RegistrationPagerFragment : Fragment(), Injectable {

    private val pageOneFragment = PageOneFragment()
    private val pageTwoFragment = PageTwoFragment()
    private val pageThreeFragment = PageThreeFragment()

    ...

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        registrationViewModel = ViewModelProviders.of(this, viewModelFactory)
                .get(RegistrationViewModel::class.java)

        pageOneFragment.viewPager = this
        pageTwoFragment.viewPager = this
        pageThreeFragment.viewPager = this
    }

    ...

    fun previousPage() {
        if (viewPager.currentItem == 0) return
        var previousPageIndex = viewPager.currentItem - 1
        viewPager.setCurrentItem(previousPageIndex)
    }

    fun nextPage() {
        if (viewPager.currentItem == viewPager.adapter!!.count - 1) return
        var nextPageIndex = viewPager.currentItem + 1
        viewPager.setCurrentItem(nextPageIndex)
    }

    fun onBackPressed() {
        if (viewPager.currentItem > 0) {
            previousPage()
        } else {
            activity?.onBackPressed()
        }
    }

    ...
}

PageOneFragment

class PageOneFragment : Fragment() {

    lateinit var viewPager: ViewPagerFragment

    ...

    fun someFunctionThatTriggersAlertDialog() {
        context?.showError(
            R.string.some_alert_message,
            negativeLabel = R.string.modal_action_back,
            negativeAction = { 
                viewPager.onBackPressed() 
            },
            positiveLabel = R.string.modal_action_next,
            positiveAction = { 
                viewPager.nextPage() 
            }
         )
    }

    ...

当PageOneFragment显示该AlertDialog时,负/正函数不会调用viewPager.nextPage()函数。

如果我将viewPager.nextPage()函数内部的内容放到我所说的块中(就像我在上面的工作示例中所做的那样),它将很好地工作。为什么会这样?

android android-fragments kotlin android-viewpager android-alertdialog
1个回答
0
投票

为什么要完全使用ViewPager?您为什么不处理活动中的片段?这样,您始终可以获取堆栈中的上一个片段,或者在肯定按钮上调用下一个片段的函数。

© www.soinside.com 2019 - 2024. All rights reserved.