在 ActionMode 之上显示 ActionMode
Show ActionMode over ActionMode
我有一个列表 activity,用户可以在其中执行打开操作模式 A
和 B
。用户还可以打开操作模式 A
,然后在其上打开 B
。
问题是,当显示动作模式 A
并在其上方显示动作模式 B 时,当显示 B
时,A
会自动关闭。用户无法从 B
导航回 A
。
我想我可以在打开操作模式 B
时记录操作模式 A
的可见性,然后在关闭操作模式 B
时恢复它,但这不起作用.似乎不可能在关闭一个动作模式后立即显示另一个动作模式。但是,仅当使用后退箭头关闭操作模式 A 时才会发生此问题。当通过代码 (ActionMode.finish()
) 关闭时,可以显示操作模式 B
,但关闭动画不会让用户看起来像是从 B
返回到 A
.所以这个解决方案是没有问题的。
那么有没有办法在另一个动作模式之上打开一个动作模式,或者至少以编程方式替换动作模式的菜单布局然后将其改回?
动作模式A
其实就是搜索动作模式,用户可以从中select结果打开动作模式B
如果可以帮助理解
我想我通过动作模式 B 的 onDestroyActionMode 中的 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)
}
我有一个列表 activity,用户可以在其中执行打开操作模式 A
和 B
。用户还可以打开操作模式 A
,然后在其上打开 B
。
问题是,当显示动作模式 A
并在其上方显示动作模式 B 时,当显示 B
时,A
会自动关闭。用户无法从 B
导航回 A
。
我想我可以在打开操作模式 B
时记录操作模式 A
的可见性,然后在关闭操作模式 B
时恢复它,但这不起作用.似乎不可能在关闭一个动作模式后立即显示另一个动作模式。但是,仅当使用后退箭头关闭操作模式 A 时才会发生此问题。当通过代码 (ActionMode.finish()
) 关闭时,可以显示操作模式 B
,但关闭动画不会让用户看起来像是从 B
返回到 A
.所以这个解决方案是没有问题的。
那么有没有办法在另一个动作模式之上打开一个动作模式,或者至少以编程方式替换动作模式的菜单布局然后将其改回?
动作模式A
其实就是搜索动作模式,用户可以从中select结果打开动作模式B
如果可以帮助理解
我想我通过动作模式 B 的 onDestroyActionMode 中的 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)
}