Я будую додаток для 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 рівень 11".
Насправді є два класи, другий розширює перший - android.text.ClipboardManager та android.content.ClipboardManager.
android.text.ClipboardManager існує з API 1, але він працює лише з текстовим вмістом.
android.content.ClipboardManager є кращим способом роботи з буфером обміну, але він недоступний на рівні API <11 (стільник).
Для отримання будь-якого з них вам потрібен наступний код:
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());
}
}
}
Що стосується 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);
}
}
Для Котліна ми можемо використовувати наступний метод. Ви можете вставити цей метод всередині активності або фрагменту.
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.
частина, якої я бракувала, могла бути тому, що я це роблю в межах фрагмента.