首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

EditText中未显示Android默认的剪切/复制/粘贴

在EditText中未显示Android默认的剪切/复制/粘贴选项可能是由于以下几个原因:

  1. 缺少文本选择功能:EditText默认情况下是没有启用文本选择功能的,因此无法显示剪切/复制/粘贴选项。要启用文本选择功能,可以通过设置EditText的textIsSelectable属性为true来实现:
代码语言:txt
复制
<EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textIsSelectable="true" />
  1. 缺少上下文菜单:剪切/复制/粘贴选项通常通过上下文菜单显示。如果EditText没有设置上下文菜单,那么这些选项就不会显示出来。可以通过注册上下文菜单来实现:
代码语言:txt
复制
EditText editText = findViewById(R.id.editText);
registerForContextMenu(editText);

然后在Activity中重写onCreateContextMenu()方法来创建上下文菜单:

代码语言:txt
复制
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    getMenuInflater().inflate(R.menu.context_menu, menu);
}

res/menu目录下创建context_menu.xml文件,并添加剪切/复制/粘贴选项:

代码语言:txt
复制
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/cut"
        android:title="剪切" />
    <item
        android:id="@+id/copy"
        android:title="复制" />
    <item
        android:id="@+id/paste"
        android:title="粘贴" />
</menu>

最后,重写onContextItemSelected()方法来处理选项的点击事件:

代码语言:txt
复制
@Override
public boolean onContextItemSelected(MenuItem item) {
    EditText editText = findViewById(R.id.editText);
    switch (item.getItemId()) {
        case R.id.cut:
            editText.cut();
            return true;
        case R.id.copy:
            editText.copy();
            return true;
        case R.id.paste:
            editText.paste();
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

这样,当用户长按EditText时,上下文菜单将显示剪切/复制/粘贴选项。

  1. 自定义文本选择菜单:如果你想要自定义剪切/复制/粘贴选项的样式或行为,可以通过使用ActionMode来实现。首先,为EditText设置一个长按监听器,当用户长按时,创建并显示ActionMode:
代码语言:txt
复制
EditText editText = findViewById(R.id.editText);
editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        getMenuInflater().inflate(R.menu.custom_selection_menu, menu);
        return true;
    }

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

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        EditText editText = findViewById(R.id.editText);
        int start = editText.getSelectionStart();
        int end = editText.getSelectionEnd();
        CharSequence selectedText = editText.getText().subSequence(start, end);
        switch (item.getItemId()) {
            case R.id.cut:
                editText.getText().replace(start, end, "");
                mode.finish();
                return true;
            case R.id.copy:
                ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData clip = ClipData.newPlainText("text", selectedText);
                clipboard.setPrimaryClip(clip);
                mode.finish();
                return true;
            case R.id.paste:
                editText.getText().replace(start, end, clipboard.getPrimaryClip().getItemAt(0).getText());
                mode.finish();
                return true;
            default:
                return false;
        }
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
    }
});

res/menu目录下创建custom_selection_menu.xml文件,并添加剪切/复制/粘贴选项:

代码语言:txt
复制
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/cut"
        android:title="剪切" />
    <item
        android:id="@+id/copy"
        android:title="复制" />
    <item
        android:id="@+id/paste"
        android:title="粘贴" />
</menu>

这样,当用户长按EditText时,自定义的文本选择菜单将显示剪切/复制/粘贴选项。

对于以上问题,腾讯云提供了一系列云计算相关的产品和服务,如云服务器、云数据库、云存储等,可以根据具体需求选择适合的产品。更多关于腾讯云产品的信息,请参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android自由选择TextView的文字 博客分类: Android AndroidUP

用过EditText的都知道,EditText有个特点,当在里面长按的时候,会出现一个ContextMenu,提供了选择文字,复制,剪切等功能。有时候,我们会想,如果不出现这个ContextMenu,直接就在view上选择文字,那多美好啊。相信很多人抱有这样的想法,很不幸,我也是。于是我就研究了一下EditText和TextView的代码,然后将这个问题解决了。       网上很多资料都说,要选择一段文字,只需要用Selection.getSelectionStart()和Selection.getSelectionEnd()确定选择的文字的头和尾,然后加颜色就行。简直是胡扯啊,我敢说这样的代码根本就没有经过验证,就发到网上了,然后一大堆人互相转载,结果导致误导了很多人,杯具 啊!!       好,我们来分析一下解决办法。       TextView是很多View的基类,如Button、EditText都是继承自他,所以EditText里面的代码很少。我们看一下EditText的源码,有一个Override的getDefaultEditable方法,看名字的意思是是否可编辑,这个方法直接返回true。还有一个getDefaultMovementMethod方法,它返回的是ArrowKeyMovementMethod.getInstance(),通过查看ArrowKeyMovementMethod的源码,基本确定这个方法就是弹出ContextMenu和轨迹球监听的“元凶”。       下面,我们自己做一个view来打造自己的EditText。       我取名TextPage,继承EditText,在里面覆盖getDefaultEditable和getDefaultMovementMethod。

01

Android开发笔记(一百三十八)文本输入布局TextInputLayout

TextInputLayout是MaterialDesign库中对编辑框EditText进行增强的一个控件。众所周知,EditText未输入字符时,我们可以给它显示默认的提示文字hint;可是一旦输入字符,这个hint提示就消失了,虽然没有提示也没有什么大碍,但有总比没有好呀。TextInputLayout便是用来解决提示文字的显示问题,它默认把提示文字显示在编辑框的上方,这样在编辑框内输入文字,就不影响上方的提示文字了。 代码中使用TextInputLayout要进行以下改造: 1、添加几个库的支持,包括design库(TextInputLayout需要)、appcompat-v7库(AppCompatActivity); 2、编辑框所在页面的Activity需要继承自AppCompatActivity,否则运行时打开页面会报错; 3、布局文件中在TextInputLayout节点下面加入EditText控件,必须并且只能加入一个EditText; 下面是TextInputLayout新增的方法说明: setHint : 设置提示文字的内容。 setHintEnabled : 设置提示文字是否可用。 setHintTextAppearance : 设置提示文字的风格。 setHintAnimationEnabled : 设置提示文字的展示动画是否可用。 setError : 设置错误文字的内容。 setErrorEnabled : 设置错误文字是否可用。 setCounterEnabled : 设置文字计数器是否可用。 setCounterMaxLength : 设置文字计数器的最大长度。 从以上方法可以看到,TextInputLayout增加的界面元素主要是三个,分别是位于编辑框左上角的提示文字、位于编辑框左下角的错误文字、位于编辑框右下角的文字计数器。具体的文本输入布局效果如见下:

03
领券