我想为 TextView 启用标准复制粘贴(与 EditText 相同)。我该怎么办?
我尝试使用不可编辑的 EditText,但效果不佳(有时它变得可编辑或复制粘贴叠加层未显示)。一般来说,这可能不是一个好方法。
需要一个从 API 7 开始的可行解决方案。
要启用 TextView 的标准复制/粘贴,您可以选择以下选项之一:
更改布局文件:将以下属性添加到您的 TextView
android:textIsSelectable="true"
在您的 Java 类中编写此行以通过编程方式进行设置。
myTextView.setTextIsSelectable(true);
长按 TextView 您可以看到复制/粘贴操作栏。
这适用于蜂巢前的复制:
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();
}
});
在 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
需要 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;
}
});
使用主题
@android:style/Theme.Black.NoTitleBar.Fullscreen
或
@android:style/Theme.WithActionBar
在xml中设置TextView
android:textIsSelectable="true"
查看结果
如果有人想多做一点,一键选择并复制到剪贴板:
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
是将复制到剪贴板的文本。
以下是启用标准复制/粘贴的方法:
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:还可以进行剪切、分享等
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"/>
这个更好:
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");
}
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"
完成!
对于
EditText
,
在活动使用的清单中
android:windowSoftInputMode="adjustResize"