Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android从textView自定义选择操作模式中删除CAB菜单_Android_Textview - Fatal编程技术网

Android从textView自定义选择操作模式中删除CAB菜单

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

我通过这段代码添加了一个自定义上下文菜单

ns_text_menu.xml仅包含两项

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来确定您正在处理的菜单