Я создаю приложение для 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;
label
?
Context context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Таким образом, все согласны с тем, как это должно быть сделано, но поскольку никто не хочет дать полное решение, здесь идет речь:
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" />
label
в newPlainText
методе? Документация гласит label User-visible label for the clip data.
. Но когда он label
виден пользователю? И какое значение / имя мне следует указать label
?
Googling приводит вас к android.content.ClipboardManager, и вы можете, как и я, решить, что буфер обмена недоступен в API <11, потому что на странице документации написано «С: API Level 11».
На самом деле существует два класса, второй расширяет первый - android.text.ClipboardManager и android.content.ClipboardManager.
android.text.ClipboardManager существует с API 1, но работает только с текстовым содержимым.
android.content.ClipboardManager является предпочтительным способом работы с буфером обмена, но он недоступен на уровне API <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 за проверку версии). Вы можете привязать их к событию нажатия кнопки.
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());
}
}
}
Начиная с 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
. Вы можете проверить каждый из них, если найдете этот способ более читабельным.Чтобы включить стандартное копирование / вставку для TextView, U может выбрать один из следующих:
Изменение в файле макета: добавьте свойство ниже к вашему TextView
android:textIsSelectable="true"
В вашем Java-классе напишите эту строку два грамматически.
myTextView.setTextIsSelectable(true);
И долгое нажатие на TextView вы можете увидеть панель действий копирования / вставки.
@FlySwat уже дал правильный ответ, я просто делюсь полным ответом:
Используйте метод ClipboardManager.setPrimaryClip ( http://developer.android.com/reference/android/content/ClipboardManager.html ):
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);
Где label
видимая пользователем метка для данных клипа и
text
фактический текст в клипе. Согласно официальным документам .
Важно использовать этот импорт:
import android.content.ClipboardManager;
Вот мой рабочий код
/**
* Method to code text in clip board
*
* @param context context
* @param text text what wan to copy in clipboard
* @param label label what want to copied
*/
public static void copyCodeInClipBoard(Context context, String text, String label) {
if (context != null) {
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText(label, text);
if (clipboard == null || clip == null)
return;
clipboard.setPrimaryClip(clip);
}
}
Для 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)
}
context.
была та часть, по которой я скучал - возможно, потому что я делаю это внутри фрагмента.