Wie kopiere ich Text programmgesteuert in meine Android App?

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

FlySwat
quelle
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" />
Warpzit
quelle
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

Viachaslau Tysianchuk
quelle
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 ..

Ayrina
quelle
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());
        }
    }
}
Live-Liebe
quelle
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.
Suragch
quelle
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.

König der Massen
quelle
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;

Mor2
quelle
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;
Dreieinigkeit
quelle
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);

    }
}
Mehul Boghra
quelle
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)

}
Vijayakumar G.
quelle
Danke dir! Das context.war der Teil, den ich vermisst habe - könnte sein, weil ich es innerhalb eines Fragments mache.
Cullub