我正在开发一个Android应用程序,需要复制EditText小部件的文本值。 用户可以按下Menu+A
,然后按下Menu+C
来复制该值,但我该如何通过编程实现此操作?
我正在开发一个Android应用程序,需要复制EditText小部件的文本值。 用户可以按下Menu+A
,然后按下Menu+C
来复制该值,但我该如何通过编程实现此操作?
使用ClipboardManager#setPrimaryClip
方法:
import android.content.ClipboardManager;
// ...
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);
import android.content.ClipboardManager;
导入剪贴板管理器。 - MatheusJardimBlabel
是什么? - Alaa M.Context context = getApplicationContext(); Toast.makeText(context, "文本已复制", Toast.LENGTH_LONG).show();
- Shady Mohamed Sherif所以大家都同意应该这样做,但由于没有人想提供完整的解决方案,所以我来说:
int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText("text to clip");
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("text label","text to clip");
clipboard.setPrimaryClip(clip);
}
我假设您在清单文件中声明了以下内容:
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
newPlainText
方法中的label
有什么用途?根据文档,label
是“剪贴板数据对用户可见的标签”。但是,在什么情况下用户才能看到label
?我应该在label
中放入什么样的值或名称呢? - shadyinside从Android Oreo开始,支持库只支持API 14及以上版本。大多数新应用程序的最低API也可能是14,因此不需要担心其他答案中提到的与API 11相关的问题。许多代码可以进行清理。(但如果您仍在支持较低版本,请参阅我的编辑历史记录。)
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null || clip == null) return;
clipboard.setPrimaryClip(clip);
我将这段代码作为额外奖励添加,因为复制和粘贴通常成对出现。
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
try {
CharSequence text = clipboard.getPrimaryClip().getItemAt(0).getText();
} catch (Exception e) {
return;
}
android.content.ClipboardManager
版本而不是旧的android.text.ClipboardManager
。同样适用于ClipData
。context.getSystemService()
获取服务。null
。如果您发现这种方式更易读,请检查每个值。谷歌搜索会带您到android.content.ClipboardManager,您可能会像我一样决定,在API < 11上不使用Clipboard,因为文档页面上写着“自API Level 11起”。
实际上有两个类,第二个类是扩展了第一个类 - android.text.ClipboardManager和android.content.ClipboardManager。
android.text.ClipboardManager从API 1就开始存在,但它只能处理文本内容。
android.content.ClipboardManager是与剪贴板配合的首选方法,但在API Level < 11(Honeycomb)上不可用。
要获取它们中的任何一个,您需要以下代码:
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
但是对于API < 11,您需要导入android.text.ClipboardManager
,而对于API >= 11,则需要导入android.content.ClipboardManager
public void onClick (View v)
{
switch (v.getId())
{
case R.id.ButtonCopy:
copyToClipBoard();
break;
case R.id.ButtonPaste:
pasteFromClipBoard();
break;
default:
Log.d(TAG, "OnClick: Unknown View Received!");
break;
}
}
// Copy EditCopy text to the ClipBoard
private void copyToClipBoard()
{
ClipboardManager clipMan = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipMan.setPrimaryClip(editCopy.getText());
}
你可以尝试这个...
以下是一些代码,可以实现从EditText复制和粘贴的功能(感谢Warpzit版本检查)。您可以将它们挂钩到按钮的onclick事件上。
public void copy(View v) {
int startSelection = txtNotes.getSelectionStart();
int endSelection = txtNotes.getSelectionEnd();
if ((txtNotes.getText() != null) && (endSelection > startSelection ))
{
String selectedText = txtNotes.getText().toString().substring(startSelection, endSelection);
int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(selectedText);
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("WordKeeper",selectedText);
clipboard.setPrimaryClip(clip);
}
}
}
public void paste(View v) {
int sdk = android.os.Build.VERSION.SDK_INT;
if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
if (clipboard.getText() != null) {
txtNotes.getText().insert(txtNotes.getSelectionStart(), clipboard.getText());
}
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
if (item.getText() != null) {
txtNotes.getText().insert(txtNotes.getSelectionStart(), item.getText());
}
}
}
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "Text to copy");
if (clipboard == null || clip == null)
return;
clipboard.setPrimaryClip(clip);
并导入 import android.content.ClipboardManager;
android:textIsSelectable="true"
在你的Java类中,写下以下代码以使语法正确:
myTextView.setTextIsSelectable(true);
长按TextView后,你可以看到复制/粘贴操作栏。
对于 Kotlin,我们可以使用以下方法。您可以将此方法粘贴到活动或片段中。
fun copyToClipBoard(context: Context, message: String) {
val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipData = ClipData.newPlainText("label",message)
clipBoard.setPrimaryClip(clipData)
}
或者创建一个Kotlin扩展
fun String.copyToClipboard(context: Context) {
val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipData = ClipData.newPlainText("label",this)
clipBoard.setPrimaryClip(clipData)
}
"stringToCopy".copyToClipboard(requireContext())