传递AlertDialog NegativeButton Listener函数

每当显示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()函数内部的内容放在我称为该函数的块内(就像我在上面的工作示例中所做的那样),它将很好地工作。为什么会这样?

raners 回答:传递AlertDialog NegativeButton Listener函数

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

本文链接:https://www.f2er.com/3026509.html

大家都在问