如何删除EditText的“文本选择”上下文操作栏,但保留文本选择功能

时间:2015-06-23 10:33:39

标签: android

我想为EditText上的基本复制,剪切,粘贴和格式化操作创建自定义界面。但是当我开始选择文本时,文本选择上下文栏显示在顶部。我无法弄清楚如何删除CAB 并仍保持选择文字的能力

使用@Override public void run() { for (int i = table1.getRowCount()-1; i >= 0; i--) { int modelIndex = table1.convertRowIndexToModel(i); String status = table1.getModel().getValueAt(modelIndex, 9).toString(); if (status.equalsIgnoreCase("Cleared")) { deleteRow(table1, table1Model, i); } } } 覆盖setCustomSelectionActionModeCallback会删除上下文栏,但它也会删除选择文字的功能。

2 个答案:

答案 0 :(得分:0)

我设法通过改变styles.xml中的*actionMode*项的样式来解决这个问题。

想法是制作动作模式动作栏覆盖窗口,高度为1px,透明且默认drawables设置为空白。

styles.xml 风格

<resources>
<style name="AppTheme" parent="android:Theme.Holo.Light.NoActionBar">
    <item name="android:windowNoTitle">true</item>

    <!--how to hide action mode-->
    <item name="android:windowActionModeOverlay">true</item>
    <item name="android:actionModeStyle">@style/ActionModeStyleBlank</item>
    <item name="android:actionModeBackground">@android:color/transparent</item>
    <item name="android:actionModeCopyDrawable">@drawable/blank</item>
    <item name="android:actionModeCloseDrawable">@drawable/blank</item>
    <item name="android:actionModeCutDrawable">@drawable/blank</item>
    <item name="android:actionModePasteDrawable">@drawable/blank</item>
    <item name="android:actionModeSelectAllDrawable">@drawable/blank</item>
    <item name="android:actionModeSplitBackground">@android:color/transparent</item>
</style>

<!--size should be 1px otherwise full size action bar is shown -->
<style name="ActionModeStyleBlank">
    <item name="android:actionBarSize">1px</item>
    <item name="android:height">1px</item>
</style>
</resources>

blank.xml drawable

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<size android:height="0px" android:width="0px"></size>
</shape>

答案 1 :(得分:0)

您可以完全删除ActionBarContextView。

因此,请使用以下代码:

    tv.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            removeActionBar(getWindow().getDecorView());
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode actionMode) {

        }
    });

    private void removeActionBar(View v) {
            ViewGroup viewgroup = (ViewGroup) v;

            for (int i = 0; i < viewgroup.getChildCount(); i++) {
                    View v1=viewgroup.getChildAt(i);
                    if ( v1 instanceof ViewGroup )
                            removeActionBar(v1);
                    if ( v1 instanceof ActionBarContextView ) {
                            viewgroup.removeView(v1);
                    }
            }
    }