每当显示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()函数内部的内容放到我所说的块中(就像我在上面的工作示例中所做的那样),它将很好地工作。为什么会这样?
为什么要完全使用ViewPager?您为什么不处理活动中的片段?这样,您始终可以获取堆栈中的上一个片段,或者在肯定按钮上调用下一个片段的函数。