web-dev-qa-db-de.com

Wie kopiere ich programmatisch Text in meine Android App?

Ich erstelle eine Android App und möchte den Textwert eines EditText-Widgets kopieren. Es ist dem Benutzer möglich, Menu+A Und dann Menu+C Zu drücken Kopieren Sie den Wert, aber wie würde ich dies programmgesteuert tun?

214
Zach

Verwenden ClipboardManager#setPrimaryClip Methode:

import Android.content.ClipboardManager;

// ...

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);

ClipboardManager API-Referenz

385
FlySwat

So sind sich alle einig, wie dies geschehen soll, aber da niemand eine vollständige Lösung geben möchte, gilt Folgendes:

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);
}

Ich nehme an, Sie haben so etwas wie folgendes im Manifest deklariert:

<uses-sdk Android:minSdkVersion="7" Android:targetSdkVersion="14" />
213
Warpzit

Googeln bringt Sie zu Android.content.ClipboardManager und Sie können wie ich entscheiden, dass die Zwischenablage in API <11 nicht verfügbar ist, da auf der Dokumentationsseite "Since: API Level 11" steht.

Tatsächlich gibt es zwei Klassen, die zweite erweitert die erste - Android.text.ClipboardManager und Android.content.ClipboardManager.

Android.text.ClipboardManager ist seit API 1 vorhanden, funktioniert jedoch nur mit Textinhalten.

Android.content.ClipboardManager ist die bevorzugte Methode für die Arbeit mit der Zwischenablage, ist jedoch in API Level <11 (Honeycomb) nicht verfügbar.

Um einen von ihnen zu bekommen, benötigen Sie den folgenden Code:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Aber für API <11 müssen Sie Android.text.ClipboardManager Und für API> = 11Android.content.ClipboardManager Importieren.

15
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());
}

sie können dies versuchen ..

14
ayrina

Hier ist ein Code zum Implementieren einiger Kopier- und Einfügefunktionen von EditText (dank Warpzit für die Versionsprüfung). Sie können diese mit dem Ereignis onclick Ihrer Schaltfläche verknüpfen.

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());
        }
    }
}
8
live-love

Update der Android-Unterstützungsbibliothek

Ab Android Oreo) wird die Supportbibliothek nur auf API 14 reduziert. Die meisten neueren Apps haben wahrscheinlich auch eine Mindest-API von 14 und müssen sich daher nicht um die Probleme mit API 11 kümmern in einigen der anderen Antworten erwähnt. Ein Großteil des Codes kann bereinigt werden. (Aber siehe meine Bearbeitungshistorie, wenn Sie noch niedrigere Versionen unterstützen.)

Kopieren

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null) return;
clipboard.setPrimaryClip(clip);

Einfügen

Ich füge diesen Code als Bonus hinzu, da das Kopieren/Einfügen normalerweise paarweise erfolgt.

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
try {
    CharSequence text = clipboard.getPrimaryClip().getItemAt(0).getText();
} catch (Exception e) {
    return;
}

Anmerkungen

  • Stellen Sie sicher, dass Sie die Version Android.content.ClipboardManager Und nicht die alte Version Android.text.ClipboardManager Importieren. Gleiches gilt für ClipData.
  • Wenn Sie nicht in einer Aktivität sind, können Sie den Service mit context.getSystemService() abrufen.
  • Ich habe einen try/catch-Block verwendet, um den Einfügetext abzurufen, da mehrere Dinge null sein können. Sie können jedes überprüfen, wenn Sie dies besser lesbar finden.
6
Suragch

Um das Standard-Kopieren/Einfügen für TextView zu aktivieren, können Sie eine der folgenden Optionen auswählen:

Änderung in der Layoutdatei: Fügen Sie die unten stehende Eigenschaft zu Ihrer TextView hinzu

Android:textIsSelectable="true"

Schreiben Sie in Ihrer Klasse Java diese Zeile zwei, um die Grammatik festzulegen.

myTextView.setTextIsSelectable(true);

Wenn Sie lange auf die Textansicht drücken, wird die Aktionsleiste zum Kopieren/Einfügen angezeigt.

5
King of Masses
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);

nd importierenimport Android.content.ClipboardManager;

4
Mor2

@FlySwat hat bereits die richtige Antwort gegeben, ich teile nur die vollständige Antwort:

Verwenden Sie die ClipboardManager.setPrimaryClip ( http://developer.Android.com/reference/Android/content/ClipboardManager.html ) -Methode:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip); 

Wobei label eine vom Benutzer sichtbare Bezeichnung für die Clipdaten ist und text der tatsächliche Text im Clip ist. Nach offizielle Dokumente .

Es ist wichtig, diesen Import zu verwenden:

import Android.content.ClipboardManager;
3
Trinity