Как Скопировать текст программно в моем приложении для Android?
Я создаю приложение для Android, и я хочу скопировать текстовое значение виджета EditText. Это возможно для пользователя, чтобы нажать Menu+A
затем Menu+C
чтобы скопировать значение, но как бы я сделал это программно?
8 ответов:
использовать
ClipboardManager#setPrimaryClip
способ:import android.content.ClipboardManager; // ... ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("label", "Text to copy"); clipboard.setPrimaryClip(clip);
Итак, все согласны с тем, как это должно быть сделано, но поскольку никто не хочет давать полное решение, здесь идет:
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" />
Googling приводит вас к android.содержание.ClipboardManager и вы могли бы решить, как и я, что буфер обмена не доступен на API
есть на самом деле два класса, второй расширяя первый - android.текст.ClipboardManager и android.содержание.ClipboardManager.
android.текст.ClipboardManager существует с API 1, но он работает только с текстом содержание.
android.содержание.ClipboardManager-это предпочтительный способ работы с буфером обмена, но он недоступен на уровне API
чтобы получить любой из них нужен следующий код:
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
но API вы должны импортировать
android.text.ClipboardManager
и API > = 11android.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()); } } }
чтобы включить стандартное копирование / вставку для TextView, вы можете выбрать один из следующих вариантов:
изменить файл макета: добавить свойство ниже в свой 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;
обновление библиотеки поддержки Android
начиная с Android Oreo, библиотека поддержки работает только до API 14. Большинство новых приложений, вероятно, также имеют минимальный API 14, и, следовательно, не нужно беспокоиться о проблемах с API 11, упомянутых в некоторых других ответах. Большая часть кода может быть очищена. (Но смотрите мою историю редактирования, если вы все еще поддерживаете более низкие версии.)
скопировать
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("label", selectedText); if (clipboard == 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()
.- я использовал блок try / catch для получения текста вставки, потому что несколько вещей могут быть
null
. Вы можете проверить каждый из них, если вы найдете этот способ более читаемым.