我有一个列表活动,用户可以在其中执行打开操作模式A和B。用户还可以打开操作模式A,然后在其之上打开B。
问题是,当显示动作模式A,在上面显示动作模式B时,A会在显示B时自动关闭。用户无法从B导航到A。
我想我可以在打开动作模式A时注意到动作模式B的可见性,然后在动作模式B关闭时恢复它,但这是行不通的。在关闭一个动作模式后,似乎不可能立即显示另一个动作模式。但是,只有当操作模式A用后箭头关闭时,才会发生此问题。当代码(ActionMode.finish())关闭时,可以显示动作模式B,但是关闭动画并不会使它看起来像是用户从B导航回A。所以这个解决方案是不可能的。
那么,是否有一种方法可以在另一种模式之上打开操作模式,或者至少以编程方式替换操作模式的菜单布局,然后将其更改回?
操作模式A实际上是搜索操作模式,用户可以从中选择打开操作模式B的结果,如果这有助于理解的话。
发布于 2018-07-18 15:17:16
我认为我通过动作模式B的postDelayed()实现了期望的行为。这不是非常优雅的解决方案,但它有效。
我的代码片段:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
listView.onItemClickListener = AdapterView.OnItemClickListener { adapterView, view, p2, p3 ->
startActionModeA()
true
}
}
var actionModeA: ActionMode? = null
val actionModeCallbackA = object : ActionMode.Callback {
override fun onActionItemClicked(mode: ActionMode?, p1: MenuItem?): Boolean {
Log.wtf("ACTION MODE", "onActionItemClicked")
actionModeB = startActionMode(actionModeCallbackB)
return true
}
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
Log.wtf("ACTION MODE", "onCreateActionMode")
val inflater = mode?.getMenuInflater()
inflater?.inflate(R.menu.context_menu, menu)
return true
}
override fun onPrepareActionMode(p0: ActionMode?, p1: Menu?): Boolean {
Log.wtf("ACTION MODE", "onPrepareActionMode")
return false
}
override fun onDestroyActionMode(p0: ActionMode?) {
Log.wtf("ACTION MODE", "onDestroyActionMode")
actionModeA = null
}
}
var actionModeB: ActionMode? = null
val actionModeCallbackB = object : ActionMode.Callback {
override fun onActionItemClicked(mode: ActionMode?, p1: MenuItem?): Boolean {
Log.wtf("ACTION MODE 2", "onActionItemClicked")
return true
}
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
Log.wtf("ACTION MODE 2", "onCreateActionMode")
val inflater = mode?.getMenuInflater()
inflater?.inflate(R.menu.context_menu2, menu)
return true
}
override fun onPrepareActionMode(p0: ActionMode?, p1: Menu?): Boolean {
Log.wtf("ACTION MODE 2", "onPrepareActionMode")
return false
}
override fun onDestroyActionMode(mode: ActionMode?) {
Log.wtf("ACTION MODE 2", "onDestroyActionMode")
actionModeB = null
listView.postDelayed({
startActionModeA()
}, 100)
}
}
private fun startActionModeA() {
actionModeA = startActionMode(actionModeCallbackA)
}https://stackoverflow.com/questions/51235380
复制相似问题