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