Wie kopiere ich Text programmgesteuert in meine Android App?


231

Ich erstelle eine Android-App und möchte den Textwert eines EditText-Widgets kopieren. Es ist für den Benutzer möglich, Menu+Adann zu drücken, Menu+Cum den Wert zu kopieren, aber wie würde ich dies programmgesteuert tun?



Dies ist im Grunde eine doppelte Frage von: stackoverflow.com/a/13517876/2116185
user2116185

Antworten:


419

Verwendung ClipboardManager#setPrimaryClipMethode:

import android.content.ClipboardManager;

// ...

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

ClipboardManager API-Referenz


7
Verwenden Sieimport android.content.ClipboardManager;
MatheusJardimB

Funktioniert diese Funktion unter API 11+ (einschließlich Lollipop) oder nicht?
Ashraf Alshahawy

22
Was ist label?
Alaa M.

Gibt es eine Möglichkeit, dies zu tun, ohne dass das Clip-Fach angezeigt wird? (LG G4S 5.1.1)
Alaa M.

2
Sie können auch nach dem Kopieren eine Erfolgsmeldung hinzufügen, um dem Benutzer mitzuteilen, dass der Text kopiert wurdeContext context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Shady Sherif

217

Alle sind sich einig, wie dies getan werden soll, aber da niemand eine vollständige Lösung geben möchte, geht es weiter:

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 gehe davon aus, dass Sie so etwas wie Folgendes im Manifest deklariert haben:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />

Es funktioniert nicht, da der Compiler einen Fehler auslöst: Für den Aufruf ist API-Level 11 erforderlich (derzeit mindestens 7): android.content.ClipboardManager # setPrimaryClip line 245 Android Lint Problem.
JavaRunner

2
Haben Sie Ihrem Manifest target und min sdk hinzugefügt? Wenn ja, deaktivieren Sie die Flusenwarnung.
Warpzit

4
Fügen Sie über Ihrer Methode die folgenden 3 Zeilen hinzu: @SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("Verfall"), @TargetApi (11) ........ Das habe ich getan und es funktioniert.
RRTW

2
Kann mir bitte jemand sagen, was genau die Verwendung labelin der newPlainTextMethode ist? Die Dokumentation besagt label User-visible label for the clip data.. Aber wann ist das labelfür den Benutzer sichtbar? Und welche Art von Wert / Name soll ich eingeben label?
Shadyinside

@tannerjohn Ich vermute, dass es eine Art Vorschau ist, die irgendwo verwendet wird. Aber ich weiß nicht wo. Aber Sie könnten den gleichen Text nur zweimal verwenden ...
Warpzit

15

Durch Googeln gelangen Sie zu android.content.ClipboardManager, und Sie können wie ich entscheiden, dass die Zwischenablage für API <11 nicht verfügbar ist, da auf der Dokumentationsseite "Seit: API Level 11" steht.

Es gibt tatsächlich 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 zum Arbeiten mit der Zwischenablage, ist jedoch auf API-Ebene <11 (Honeycomb) nicht verfügbar.

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

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Für API <11 müssen Sie jedoch importieren android.text.ClipboardManagerund für API> = 11 android.content.ClipboardManager


14
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 ..


8

Hier ist ein Code zum Implementieren einiger Funktionen zum Kopieren und Einfügen von EditText (danke an Warpzit für die Versionsprüfung). Sie können diese mit dem Onclick-Ereignis 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());
        }
    }
}

Ist es nicht möglich, die Methoden zum Kopieren / Einfügen / Ausschneiden von Android aufzurufen, ohne sie wie Sie zu schreiben? Ich habe eine benutzerdefinierte Textauswahl-Symbolleiste mit der Funktionalität erstellt, mit der der Benutzer einen ausgewählten Text fett / kursiv / unterstrichen usw. erstellen kann. Nach der Anpassung funktionieren die Standardfunktionen Kopieren / Einfügen / Ausschneiden jedoch nicht mehr, sondern die Symbole für erscheint sie noch?

Wofür ist "WordKeeper"?
Android-Entwickler

7

Update der Android-Unterstützungsbibliothek

Ab Android Oreo ist die Support-Bibliothek nur auf API 14 beschränkt. 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, die in einigen der anderen Antworten erwähnt werden. Ein Großteil des Codes kann bereinigt werden. (Aber siehe meinen Bearbeitungsverlauf, wenn Sie noch niedrigere Versionen unterstützen.)

Kopieren

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null || clip == 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 android.content.ClipboardManagerVersion und nicht die alte importieren android.text.ClipboardManager. Gleiches gilt für ClipData.
  • Wenn Sie nicht an einer Aktivität teilnehmen, können Sie den Service mit erhalten context.getSystemService().
  • Ich habe einen Try / Catch-Block verwendet, um den Einfügetext zu erhalten, da mehrere Dinge möglich sind null. Sie können jeden einzelnen überprüfen, wenn Sie ihn auf diese Weise besser lesbar finden.

1
Wofür ist "Textetikett"?
Android-Entwickler

@androiddeveloper, ich habe das Label noch nie für irgendetwas verwendet, aber siehe diese Fragen und Antworten .
Suragch

Obwohl es besagt, dass es für die Benutzer sichtbar ist, ist es tatsächlich nicht sichtbar und hängt von den Entwicklern ab, die es bei Bedarf verwenden.
Android-Entwickler

5

Um das Standard-Kopieren / Einfügen für TextView zu aktivieren, kann U eine der folgenden Optionen auswählen:

Änderung in der Layoutdatei: Fügen Sie Ihrer TextView die folgende Eigenschaft hinzu

android:textIsSelectable="true"

Schreiben Sie in Ihrer Java-Klasse diese Zeile zwei und legen Sie die Grammatik fest.

myTextView.setTextIsSelectable(true);

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


5
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
if (clipboard == null || clip == null)
    return;
clipboard.setPrimaryClip(clip);

Und importieren import android.content.ClipboardManager;


3

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

Verwenden Sie die Methode 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); 

Wo label ist eine vom Benutzer sichtbare Beschriftung für die Clipdaten und textist der tatsächliche Text im Clip. Nach offiziellen Angaben .

Es ist wichtig, diesen Import zu verwenden:

import android.content.ClipboardManager;

Warum kopierst du Antworten und fügst sie ein? Was ist ein Etikett?
AlexS

@AlexS wie gesagt, ein anderer Freund hat bereits eine richtige Antwort gegeben, ich poste nur einen anderen Weg mit mehr Details, ich denke, es wäre für jemanden nützlich
Trinity

1

Hier ist mein Arbeitscode

/**
 * 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);

    }
}

Wenn Sie einen Code geteilt haben, versuchen Sie ihn zu erklären. Sie können besuchen und überprüfen, wie eine Frage beantwortet werden kann .
Yunus Temurlenk

@YunusTemurlenk Vielen Dank für Ihre Vorschläge, das nächste Mal werde ich meine Antworten mit einer Beschreibung bearbeiten
Mehul Boghra

1

Für Kotlin können wir die folgende Methode verwenden. Sie können diese Methode in eine Aktivität oder ein Fragment einfügen.

fun copyToClipBoard(context: Context, message: String) {

    val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clipData = ClipData.newPlainText("label",message)
    clipBoard.setPrimaryClip(clipData)

}

Danke dir! Das context.war der Teil, den ich vermisst habe - könnte sein, weil ich es innerhalb eines Fragments mache.
Cullub
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.