如何以编程方式关闭文本选择上下文操作栏?

时间:2014-08-07 13:19:56

标签: android android-dialog android-dialogfragment contextual-action-bar android-actionmode

修改

初始问题:

我有一个扩展DialogFragment的片段。在这个片段中,我创建了一个AlertDialog并设置了一个适配器。适配器使用自定义布局使TextViews可选。

现在一切都很好,花花公子但是在选择了一些文字并关闭了对话框之后,之后文本被选中但是动作栏不再显示了。只能通过重新创建启动片段的活动来修复它。

tl; dr :使用静态对话框。选择文本和dismiss()后,可以选择文本,但无法找到CAB。也许以编程方式关闭CAB可以解决这个问题。我该怎么做?

一般问题:

我想了解如何手动关闭默认 android文本选择CAB(或获取对它的引用)。

3 个答案:

答案 0 :(得分:3)

我通过为每个片段创建一个新对话框来解决我的初始问题。使用静态对话框以某种方式搞砸了我的文本选择。这太糟糕了,因为我现在每次启动DialogFragment时都要做一堆调整。

现在我的一般性问题我通过将ActionMode回调设置为我的适配器的每个convertView来解决这个问题。这样我就可以在获取对模式(onCreateActionMode)的引用和清除引用(onDestroyActionMode)之间随时关闭ActionMode。这是代码:

public ActionMode mActionMode;

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // (Re)Use the convertView
    ViewHolder holder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.popup_list_item, parent, false);
        holder = new ViewHolder();
        holder.textView = (TextView) convertView.findViewById(R.id.popupItem);
        holder.textView.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                mActionMode = mode;
                // Can now use the mode whenever (if it's not null)
                // e.g. call mActionMode.finish()
                return true; // true = create the ActionMode
            }

            @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) {
                mActionMode = null;
            }
        });
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    // Set text
    if (mQuery != null)
        holder.textView.setText(Html.fromHtml(getItem(position)));
    else
        holder.textView.setText(getItem(position));

    return convertView;
}

但是我无法解决我的初始问题(即使能够手动关闭ActionMode),所以我不得不放弃使用静态对话框。

我愿意接受有关如何解决我的初始问题的建议,如果有人的话。

答案 1 :(得分:0)

如果您向我们展示了打开CAB的代码,这个问题会更容易回答,但一般来说它的工作方式如下:

实施ActionMode.Callback后,您可以像这样打开CAB:

getActivity().startActionMode(new ActionModeCallbackImpl());

但是startActionMode()会返回一个ActionMode对象,您可以将其保存在变量中:

ActionMode actionMode = getActivity().startActionMode(new ActionModeCallbackImpl());

使用此ActionMode对象,您可以稍后关闭CAB`,如下所示:

actionMode.finish();

我希望我可以帮到你,如果你有任何其他问题,请随时提问!

答案 2 :(得分:0)

我有同样的问题。我不希望CAB出现,所以我把它打扮出来。

Check this answere