Tworzę aplikację na Androida i chcę skopiować wartość tekstową widgetu EditText. Użytkownik może Menu+A
wtedy nacisnąć, Menu+C
aby skopiować wartość, ale jak mam to zrobić programowo?
Tworzę aplikację na Androida i chcę skopiować wartość tekstową widgetu EditText. Użytkownik może Menu+A
wtedy nacisnąć, Menu+C
aby skopiować wartość, ale jak mam to zrobić programowo?
Odpowiedzi:
Użyj ClipboardManager#setPrimaryClip
metody:
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();
Wszyscy zgadzają się co do tego, jak to zrobić, ale ponieważ nikt nie chce dać kompletnego rozwiązania, oto:
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);
}
Zakładam, że masz coś takiego jak zadeklarowane w manifeście:
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
label
in newPlainText
? dokumentacja stwierdza label User-visible label for the clip data.
. Ale kiedy jest label
widoczny dla użytkownika? A jaką wartość / nazwę powinienem podać label
?
Googling przenosi Cię do android.content.ClipboardManager i możesz zdecydować, tak jak ja, że Schowek nie jest dostępny w API <11, ponieważ strona dokumentacji mówi „Od: API 11”.
W rzeczywistości istnieją dwie klasy, druga rozszerzająca pierwszą - android.text.ClipboardManager i android.content.ClipboardManager.
android.text.ClipboardManager istnieje od API 1, ale działa tylko z zawartością tekstową.
android.content.ClipboardManager jest preferowanym sposobem pracy ze schowkiem, ale nie jest dostępny na poziomie API <11 (plaster miodu).
Aby uzyskać którykolwiek z nich, potrzebujesz następującego kodu:
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
Ale dla API <11 musisz zaimportować, android.text.ClipboardManager
a dla 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());
}
możesz spróbować tego ..
Oto kod do implementacji niektórych funkcji kopiowania i wklejania z EditText (dzięki Warpzit do sprawdzania wersji). Możesz podłączyć je do zdarzenia kliknięcia przycisku.
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());
}
}
}
Począwszy od Androida Oreo, biblioteka wsparcia sprowadza się tylko do API 14. Większość nowszych aplikacji prawdopodobnie ma również minimalny interfejs API wynoszący 14, a zatem nie trzeba się martwić o problemy z API 11 wspomniane w niektórych innych odpowiedziach. Wiele kodu można wyczyścić. (Ale zobacz moją historię edycji, jeśli nadal wspierasz niższe wersje).
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null || clip == null) return;
clipboard.setPrimaryClip(clip);
Dodam ten kod jako bonus, ponieważ kopiowanie / wklejanie zwykle odbywa się parami.
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
try {
CharSequence text = clipboard.getPrimaryClip().getItemAt(0).getText();
} catch (Exception e) {
return;
}
android.content.ClipboardManager
wersję zamiast starej android.text.ClipboardManager
. To samo dotyczyClipData
.context.getSystemService()
.null
. Możesz sprawdzić każdy, jeśli okaże się, że jest to bardziej czytelne.Aby włączyć standardowe kopiowanie / wklejanie dla TextView, możesz wybrać jedną z następujących opcji:
Zmień plik układu: dodaj poniżej właściwości do TextView
android:textIsSelectable="true"
W klasie Java napisz ten wiersz dwa gramatyczne.
myTextView.setTextIsSelectable(true);
I długo naciśnij TextView, możesz zobaczyć pasek akcji kopiuj / wklej.
@FlySwat już podał prawidłową odpowiedź, po prostu udostępniam pełną odpowiedź:
Użyj metody 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);
Gdzie label
jest widoczna dla użytkownika etykieta danych klipu i
text
rzeczywisty tekst w klipie. Według oficjalnych dokumentów .
Ważne jest, aby użyć tego importu:
import android.content.ClipboardManager;
Oto mój działający kod
/**
* 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);
}
}
W przypadku Kotlin możemy zastosować następującą metodę. Możesz wkleić tę metodę do działania lub fragmentu.
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.
była część, której mi brakowało - być może dlatego, że robię to w ramach fragmentu.