1

编辑:

初始问题:

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

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

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

一般问题:

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

4

3 回答 3

3

我通过为每个片段创建一个新对话框解决了我最初的问题。使用静态对话框不知何故弄乱了我的文本选择。但这太糟糕了,因为我现在每次启动 DialogFragment 时都必须进行大量调整。

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

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 之后),所以我被迫放弃使用静态对话框。

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

于 2014-08-07T16:46:51.767 回答
0

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

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

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

startActionMode()返回一个ActionMode可以保存在变量中的对象:

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

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

actionMode.finish();

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

于 2014-08-07T13:34:42.393 回答
0

我有同样的问题。我不想让 CAB 出现,所以我把它改掉了。

检查这个答案

于 2015-12-26T07:16:33.867 回答