Я создаю приложение для Android и хочу скопировать текстовое значение виджета EditText. Пользователь может нажать Menu+A, а затем Menu+C, чтобы скопировать значение, но как мне сделать это программно?
Это в основном повторяющийся вопрос: stackoverflow.com/a/13517876/2116185
Используйте метод ClipboardManager#setPrimaryClip:
import android.content.ClipboardManager;
// ...
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);
Справочник по API ClipboardManager
Используйте import android.content.ClipboardManager;
Работает ли эта функция на API 11+ (включая леденец) или нет?
Что такое label?
Есть ли способ сделать это без отображения Поднос с зажимами? (LG G4S 5.1.1)
вы также можете добавить сообщение об успешном завершении копирования, чтобы сообщить пользователю, что текст скопирован Context context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
@AlaaM. Я думаю, что этот лоток для зажимов - опция от LG, и вы не можете им управлять.
Как применить текст в Юникоде? Когда текст содержит смайлики, он отображается как xF0x9Fx98x82.
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());
}
вы можете попробовать это ..
Поиск в Google приводит вас к android.content.ClipboardManager, и вы можете решить, как и я, что буфер обмена недоступен в API <11, потому что на странице документации указано «Since: 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> = 11android.content.ClipboardManager
Итак, все согласны с тем, как это должно быть сделано, но, поскольку никто не хочет давать полное решение, вот что:
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" />
Это не работает, потому что компилятор выдает ошибку: для вызова требуется уровень API 11 (текущий мин - 7): android.content.ClipboardManager # setPrimaryClip line 245 Android Lint Проблема.
Вы добавили целевой и минимальный SDK в свой манифест? Если да, отключите предупреждение о ворсинах.
Добавьте следующие 3 строки над своим методом @SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("устаревание"), @TargetApi (11) ........ .Это то, что я сделал, и это работает.
Подскажите, пожалуйста, в чем конкретно заключается использование label в методе newPlainText? в документе указано label User-visible label for the clip data.. Но когда пользователь видит label? И какое значение / имя я должен указать в label?
@tannerjohn Я предполагаю, что это какой-то предварительный просмотр, который где-то используется. Но я не знаю где. Но вы можете просто использовать один и тот же текст дважды ...
Самый простой способ избежать ошибок «требуется уровень API 11» - это изменить if (sdk <...) на следующее: if (Build.VERSION.SDK_INT <11)
Разве это не способ вызвать метод копирования / вставки / вырезания по умолчанию, который уже существует в Android?
Вот код для реализации некоторых функций копирования и вставки из 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());
}
}
}
Разве нельзя вызывать методы копирования / вставки / вырезания в Android, не записывая их, как это делаете вы? Я создал настраиваемую панель инструментов для выделения текста с функциональностью, позволяющей пользователю сделать выделенный текст полужирным / курсивом / подчеркиванием и т. д., Но после настройки функции копирования / вставки / вырезания по умолчанию больше не работают, но значки для их еще появляется?
Для чего нужен WordKeeper?
Чтобы включить стандартное копирование / вставку для TextView, U может выбрать один из следующих вариантов:
Изменение в файле макета: добавьте свойство ниже в свой TextView
android:textIsSelectable = "true"
В вашем классе Java напишите в этой строке два грамматических значения.
myTextView.setTextIsSelectable(true);
При длительном нажатии на TextView вы можете увидеть панель действий копирования / вставки.
Что касается 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. Вы можете проверить каждый, если сочтете его более читабельным.Для чего нужен текстовый ярлык?
@androiddeveloper, я никогда ни для чего не использовал ярлык, но см. этот вопрос и ответ.
Таким образом, даже несмотря на то, что он говорит, что он видим для пользователей, на самом деле это не так, и зависит от разработчиков, которые будут использовать его при необходимости.
@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;
Почему вы копируете \ вставляете ответы? Что такое лейбл?
@AlexS, как я уже сказал, другой друг уже дал правильный ответ, я просто отправляю другой способ с более подробной информацией, я думаю, что это будет полезно для кого-то
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;
Вот мой рабочий код
/**
* 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);
}
}
Когда вы поделились кодом, попробуйте его объяснить. Вы можете посетить и проверить как ответить на вопрос.
@YunusTemurlenk Спасибо за предложения, в следующий раз отредактирую свои ответы с описанием
Для 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. был той частью, которую мне не хватало - может быть, потому, что я делаю это внутри фрагмента.
Если ваше приложение не является редактором метода ввода по умолчанию (IME) или приложением, которое в настоящее время имеет фокус, ваше приложение не может получить доступ к данным буфера обмена на Android 10 или выше. https://developer.android.com/about/versions/10/privacy/changes#clipboard-data
Для Kotlin используйте приведенный ниже код внутри действия.
import android.content.ClipboardManager
val clipBoard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipData = ClipData.newPlainText("label","Message to be Copied")
clipBoard.setPrimaryClip(clipData)
ClipboardManager. developer.android.com/reference/android/content/…