如何在 Android 中为 TextView 启用标准复制粘贴?

问题描述 投票:0回答:12

我想为 TextView 启用标准复制粘贴(与 EditText 相同)。我该怎么办?

我尝试使用不可编辑的 EditText,但效果不佳(有时它变得可编辑或复制粘贴叠加层未显示)。一般来说,这可能不是一个好方法。

需要一个从 API 7 开始的可行解决方案。

android textview copy-paste
12个回答
288
投票

尝试

android:textIsSelectable

即,

android:textIsSelectable="true"


67
投票

要启用 TextView 的标准复制/粘贴,您可以选择以下选项之一:

  1. 更改布局文件:将以下属性添加到您的 TextView

    android:textIsSelectable="true"

  2. 在您的 Java 类中编写此行以通过编程方式进行设置。

    myTextView.setTextIsSelectable(true);

长按 TextView 您可以看到复制/粘贴操作栏。


28
投票

这适用于蜂巢前的复制:

import android.text.ClipboardManager;

textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        ClipboardManager cm = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
        cm.setText(textView.getText());
        Toast.makeText(context, "Copied to clipboard", Toast.LENGTH_SHORT).show();
    }
});

16
投票

在 xml 文本视图中粘贴此代码

android:textIsSelectable="true"

然后在java文件中,

 final TextView txtcopypaste = findViewById(R.id.txtcopypaste); // my textview
    txtcopypaste.setOnClickListener(new View.OnClickListener() { // set onclick listener to my textview
        @Override
        public void onClick(View view) {
            ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE);
            cm.setText(txtcopypaste.getText().toString());              
            Toast.makeText(getApplicationContext(), "Copied :)", Toast.LENGTH_SHORT).show();
        }
    });

要求:需要复制并粘贴文本视图中的文本。

OutCome:使用textview,一旦我单击textview。它会自动复制文本视图中的文本。

注意:导入剪贴板管理器时尝试选择

请选择文本剪贴板管理器

import android.text.ClipboardManager; // prefer this 

尽量避免使用内容剪贴板管理器

import android.content.ClipboardManager; // Not this

12
投票

需要 API 11,更新代码,以前的方法已弃用

主题全屏无

ActionBar

的解决方案

扩展

TextView
并在构造函数中粘贴以下代码

this.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                ClipboardManager cManager = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData cData = ClipData.newPlainText("text", getText());
                cManager.setPrimaryClip(cData);
                Util.toast(mContext, string.text_copyed);
                return true;
            }
        });

5
投票
  1. 使用主题

    @android:style/Theme.Black.NoTitleBar.Fullscreen
    

    @android:style/Theme.WithActionBar
    
  2. 在xml中设置TextView

    android:textIsSelectable="true"
    
  3. 查看结果


3
投票

如果有人想多做一点,一键选择并复制到剪贴板:

 phone.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                            ClipData clip = ClipData.newPlainText("PhoneNumber", phone.getText());
                            clipboard.setPrimaryClip(clip);

                        }
                    });

phone 是

TextView
phone.Text
是将复制到剪贴板的文本。


0
投票

以下是启用标准复制/粘贴的方法:

TextView
类有一个定义:

boolean canPaste() {
    return (mText instanceof Editable
            && mEditor != null && mEditor.mKeyListener != null
            && getSelectionStart() >= 0
            && getSelectionEnd() >= 0
            && getClipboardManagerForUser().hasPrimaryClip());
}

可以使用以下方法绕过:

public static void enableCopyPaste(final TextView tv) {
    if(tv.getKeyListener()==null){
        tv.setKeyListener(new KeyListener(){

                @Override
                public void clearMetaKeyState(View p1, Editable p2, int p3) {
                    // unused
                }

                @Override
                public int getInputType() {
                    return tv.getInputType();
                }

                @Override
                public boolean onKeyDown(View p1, Editable p2, int p3, KeyEvent p4) {
                    // unused
                    return false;
                }

                @Override
                public boolean onKeyOther(View p1, Editable p2, KeyEvent p3) {
                    // unused
                    return false;
                }

                @Override
                public boolean onKeyUp(View p1, Editable p2, int p3, KeyEvent p4) {
                    // unused
                    return false;
                }
            });
    }

    tv.setTextIsSelectable(true);
    CharSequence mText = tv.getText();
    if(!(mText instanceof Editable)){
        tv.setText(mText,TextView.BufferType.EDITABLE);
    }
}

致电:

enableCopyPaste(YOUR_TEXTVIEW);

Ps:还可以进行剪切、分享等


0
投票
To enable text selection, you need to set the 
textIsSelectable attribute to true( android:textIsSelectable="true") in the XML.

<EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textIsSelectable="true"/>

-1
投票

这个更好:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
final android.content.ClipboardManager clipboardManager = (android.content.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
final android.content.ClipData clipData = android.content.ClipData
        .newPlainText("text label", "text to clip");
clipboardManager.setPrimaryClip(clipData);
} else {
final android.text.ClipboardManager clipboardManager = (android.text.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setText("text to clip");
}

-1
投票
  1. 您必须首先在您的
    FullScreen
    activity
    上设置
    fragment
    主题!

@

Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        requireActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }

并在

layout.xml
textview
添加:

    android:textIsSelectable="true"

完成!


-2
投票

对于

EditText
, 在活动使用的清单中
android:windowSoftInputMode="adjustResize"

© www.soinside.com 2019 - 2024. All rights reserved.