Android从textView自定义选择操作模式中删除CAB菜单
我通过这段代码添加了一个自定义上下文菜单 ns_text_menu.xml仅包含两项Android从textView自定义选择操作模式中删除CAB菜单,android,textview,Android,Textview,我通过这段代码添加了一个自定义上下文菜单 ns_text_menu.xml仅包含两项 this.textViewTest.setCustomSelectionActionModeCallback(new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { menu.clea
this.textViewTest.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
menu.clear();
mode.setTitle("Menu");
mode.getMenuInflater().inflate(R.menu.ns_text_menu, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if (item.getTitle().equals("View Vocab")) {
ErrorController.showToast(mContext, "View Vocab : " + textViewTest.getText().toString().substring(textViewTest.getSelectionStart(), textViewTest.getSelectionEnd()));
}else{//cpy
ErrorController.showToast(mContext, "Copy : " + textViewTest.getSelectionStart() + ", " + textViewTest.getSelectionEnd());
}
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
});
正如在这个答案中提到的,我使用了代码
menu.clear();
在onCreateActionMode上,清除默认的CAB菜单。它清除了一些默认上下文菜单,但仍保留以下两个菜单:
“全选”和“字典”
测试机器是GalaxyS9+android 8.0和nexus模拟器6.0
它们都显示了意想不到的菜单
如何解决此问题?似乎在onPrepareActionMode上添加了意外菜单 为了解决这个问题, 1将自定义菜单的ID存储在全局列表中。 2在onPrepareActionMode中,删除与上述列表中存储的ID不匹配的所有菜单 代码如下所示
this.textViewTest.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
private List<Integer> validResIdList = new ArrayList<>();
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
menu.clear();
validResIdList.clear();
mode.getMenuInflater().inflate(R.menu.ns_text_menu, menu);
for (int i = 0; i < menu.size(); i++) {
validResIdList.add(menu.getItem(i).getItemId());
}
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
List<Integer> toRemoveResId = new ArrayList<>();
for (int i = 0; i < menu.size(); i++) {
if (menu.getItem(i).getItemId() != (validResIdList.get(0)) && menu.getItem(i).getItemId() != (validResIdList.get(1))) {
toRemoveResId.add(menu.getItem(i).getItemId());
}
}
for (Integer resId : toRemoveResId) {
menu.removeItem(resId);
}
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if(validResIdList != null && validResIdList.size() > 0){
if (item.getItemId() == validResIdList.get(0)) {
ErrorController.showToast(mContext, "View Vocab : " + textViewTest.getText().toString().substring(textViewTest.getSelectionStart(), textViewTest.getSelectionEnd()));
mode.finish();
} else {//cpy
ErrorController.showToast(mContext, "Copy : " + textViewTest.getSelectionStart() + ", " + textViewTest.getSelectionEnd());
mode.finish();
}
}
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
});
我之所以在R.id.xxx上使用validResIdList,是因为我在一个库项目上实现了这一点
如果您在一个应用程序项目中,您可以使用R.id.xxx来确定您正在处理的菜单