我有一个EditText,我希望用户能够选择一些文本并对所选文本应用一些基本格式(粗体,斜体等)。不过,我仍然希望显示标准的复制,剪切,粘贴选项。我在Android文档中的某处读到要执行此操作,您应该在EditText上调用setCustomSelectionActionModeCallback()并将其传递给ActionModeCallback(),这就是我所做的。这是我的代码:
在我的活动的onCreate()方法中:
myEditText.setCustomSelectionActionModeCallback(new TextSelectionActionMode());
回调声明:
private class TextSelectionActionMode implements ActionMode.Callback {
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
menu.add("Bold");
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
}
我遇到的问题是,当我点击溢出按钮(访问我的“Bold”菜单项)时,ActionMode会立即关闭。如果我将其设置为始终显示为操作,请使用此:
MenuItem bold = menu.add("Bold");
bold.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
它工作正常,我可以点击它(虽然它显然什么也没做)。我在这里缺少什么?
编辑:只是想添加我遇到完全相同的问题,如果我实际上膨胀菜单而不是以编程方式添加菜单项。但是,如果我强迫它始终显示为动作,问题就会消失。
答案 0 :(得分:3)
这是框架问题。如果textview收到“焦点更改”事件,则textview将停止操作模式。当显示溢出弹出窗口时,textview会错过焦点。
答案 1 :(得分:1)
此问题已在Android 6.0中解决。但是,您应该使用Android 6.0中ActionMode.Callback2所述的here。
对于Android 5.x及更低版本,我建议使用此解决方法:向Toolbar
或ActionBar
添加一个按钮,用于记录当前选择,然后打开另一个上下文菜单。
this.inputText_selectionStart = inputText.getSelectionStart();
this.inputText_selectionEnd = inputText.getSelectionEnd();
registerForContextMenu(inputText);
openContextMenu(inputText);
unregisterForContextMenu(inputText);
答案 2 :(得分:0)
这是一个提交的Android错误:https://code.google.com/p/android/issues/detail?id=82640。 该链接包含一个解决方法。幸运的是,这已在Android 6.0中修复。