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

我想为 TextView 启用标准复制粘贴(与 EditText 相同)。如何做到这一点?

我尝试使用一个不可编辑的 EditText,但是它不能很好地工作(有时它变成可编辑的或者没有显示复制粘贴覆盖)。总的来说,这可能不是一个好的方法。

需要一个从 API 7开始的工作解决方案。

105332 次浏览

试试 android:textIsSelectable

也就是 android:textIsSelectable="true"

这适用于“蜂巢”之前的复制:

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();
}
});

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

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

    android:textIsSelectable="true"

  2. 在 Java 类中编写这一行,以编程方式设置它

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

要求 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;
}
});

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

  1. 使用主题

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

    或者

    @android:style/Theme.WithActionBar
    
  2. set TextView in xml

    android:textIsSelectable="true"
    
  3. see result

这个 更好:

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");
}

在 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 后。它自动复制文本视图中的文本。

注意: 在导入 clipboardmanager 时尝试使用

请选择短信剪贴板管理器

import android.text.ClipboardManager; // prefer this

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

import android.content.ClipboardManager; // Not this

如果有人想多走一步,点击选择并复制到剪贴板:

 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);


}
});

电话是 TextViewphone.Text是文本,将被复制到剪贴板。

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

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);

P: 它也可以切割,分享等

  1. 你必须首先在你的 activityfragment上设置 FullScreen主题!

@

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);
}

textviewlayout.xml中加上:

    android:textIsSelectable="true"

成交!