修改
初始问题:
我有一个扩展DialogFragment的片段。在这个片段中,我创建了一个AlertDialog并设置了一个适配器。适配器使用自定义布局使TextViews可选。
现在一切都很好,花花公子但是在选择了一些文字并关闭了对话框之后,之后文本被选中但是动作栏不再显示了。只能通过重新创建启动片段的活动来修复它。
tl; dr :使用静态对话框。选择文本和dismiss()
后,可以选择文本,但无法找到CAB。也许以编程方式关闭CAB可以解决这个问题。我该怎么做?
一般问题:
我想了解如何手动关闭默认 android文本选择CAB(或获取对它的引用)。
答案 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)