Android 在ActionMode上显示ActionMode

Android 在ActionMode上显示ActionMode,android,android-actionbar,android-actionmode,android-cab,Android,Android Actionbar,Android Actionmode,Android Cab,我有一个列表活动,用户可以在其中执行打开操作模式a和B。用户还可以打开动作模式A,然后再打开动作模式上方的B 问题是,当显示动作模式A且动作模式B显示在其上方时,A在显示B时自动关闭。用户无法从B导航回A 我想我可以在动作模式B打开时注意动作模式A的可见性,然后在动作模式B关闭时恢复它,但这不起作用。在关闭一个动作模式后,似乎不可能立即显示另一个动作模式。但是,只有当操作模式A使用后退箭头关闭时,才会发生此问题。当按代码(ActionMode.finish())关闭时,可以显示动作模式B,但关闭

我有一个列表活动,用户可以在其中执行打开操作模式
a
B
。用户还可以打开动作模式
A
,然后再打开动作模式上方的
B

问题是,当显示动作模式
A
且动作模式B显示在其上方时,
A
在显示
B
时自动关闭。用户无法从
B
导航回
A

我想我可以在动作模式
B
打开时注意动作模式
A
的可见性,然后在动作模式
B
关闭时恢复它,但这不起作用。在关闭一个动作模式后,似乎不可能立即显示另一个动作模式。但是,只有当操作模式A使用后退箭头关闭时,才会发生此问题。当按代码(
ActionMode.finish()
)关闭时,可以显示动作模式
B
,但关闭动画不会使其看起来用户正在从
B
导航回
A
。所以这个解决方案是不可能的

那么,有没有办法在另一个动作模式之上打开一个动作模式,或者至少以编程方式替换动作模式的菜单布局,然后再将其更改回来


动作模式
A
实际上是搜索动作模式,用户可以从中选择结果,打开动作模式
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)
    }

你能发布一些你的代码吗?我不认为这会有帮助,问题其实是要找到一种方法来显示两种动作模式,我找到的解决方案根本不行。你能发布一些你的要求的屏幕截图吗?我不能,我没有做到,也从来没有在任何应用程序上看到过。它工作得很好,谢谢!显然代码并不优雅,但在应用程序中它看起来很完美。