【问题标题】:ActionMode OnCreateActionMode not called未调用 ActionMode OnCreateActionMode
【发布时间】:2018-08-19 03:51:39
【问题描述】:

我正在开发一个带有上下文操作栏的 Android 应用程序,但没有调用 onCreateActionMode,也没有选择设置的 listview 项目,也没有 itemcheckstatechanged 侦听器工作。

下面是我如何创建动作模式:

AdapterView.OnItemLongClickListener mOnItemLongClickListener = new AdapterView.OnItemLongClickListener()
    {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
        {

            if (mActionMode != null)
            {
                return false;
            }
            Toast.makeText(getActivity(), "Long Click", Toast.LENGTH_LONG).show();
            lstRooms.setOnItemClickListener(null);
            mActionMode = getActivity().startActionMode(mActionModeCallback);
            view.setSelected(true);

            return true;
        }
    };

下面是我如何设置 OnLongItemClickListener

lstRooms.setOnItemLongClickListener(mOnItemLongClickListener);

下面是我的 ActionMode 回调。

private ActionMode.Callback mActionModeCallback = new ActionMode.Callback()
    {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu)
        {
            lstRooms.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
            lstRooms.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener()
            {
                @Override
                public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked)
                {
                    Toast.makeText(getActivity(), "Clicked", Toast.LENGTH_LONG).show();
                }

                @Override
                public boolean onCreateActionMode(ActionMode mode, Menu menu)
                {
                    MenuInflater inflater = mode.getMenuInflater();
                    inflater.inflate(R.menu.room_context_menu, menu);
                    mode.setTitle("HELLO WORLD");
                    return true;
                }

                @Override
                public boolean onPrepareActionMode(ActionMode mode, Menu menu)
                {
                    return false;
                }

                @Override
                public boolean onActionItemClicked(ActionMode mode, MenuItem item)
                {
                    return false;
                }

                @Override
                public void onDestroyActionMode(ActionMode mode)
                {

                }
            });
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu)
        {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item)
        {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode)
        {
            mActionModeCallback = null;
        }


    };

没有调用诸如 onCreateActionMode 之类的方法,所以我的标题栏没有设置,虽然操作栏确实变黑了,但由于某种原因,我知道文本应该是白色的,就好像我在 actionMode.setTitle("Hello") 之后一样我创建了它工作的对象,只是回调函数不起作用。

如前所述,另一个问题是列表视图项在我执行view.setSelected(true) 时没有显示它被选中我也尝试过lstRoom.setItemChecked(position, true)

【问题讨论】:

  • 你在哪里设置了视图的监听器?我只看到它的声明...
  • 你指的是什么听众,我想我已经包含了我所知道的所有说明,我已经从长按列表视图中启动了动作模式
  • 类似adapterView.setOnItemLongClickListener(mOnItemLongClickListener)。你的 Toast Long Click 出现了吗?
  • 我已将其添加到我的问题中,但认为它与 on click 工作无关(我确实得到了长按并且操作栏从红色更新为黑色,但没有一个菜单或文本已更新,项目也未显示为已选择)
  • 对于第二个问题,也试试这个:parent.requestFocusFromTouch(); parent.setSelection(position);,而不是view.setSelected(true);,看看它是否有效...

标签: android


【解决方案1】:

我已经设法找出问题所在。

我对多选模式侦听器的工作方式存在误解。我正在做的是注册 OnItemLongClickListener 然后在侦听器中,将其设置为多选,然后在那里创建 ActionMode.Callback 然后创建 MultiChoice 侦听器。我没有意识到 MulitiChoiceListener 实际上可以创建 ActionMode.Callback 本身,因此它们彼此冲突。

相反,我摆脱了所有这些,只创建一个 MultiChoiceModeListener 来创建上下文操作栏本身。

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多