Wie kopiere ich Text in die Zwischenablage in Android?

313

Kann mir bitte jemand sagen, wie ich den in einer bestimmten Textansicht vorhandenen Text in die Zwischenablage kopieren kann, wenn eine Taste gedrückt wird?

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainpage);
        textView = (TextView) findViewById(R.id.textview);
        copyText = (Button) findViewById(R.id.bCopy);
        copyText.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
                String getstring = textView.getText().toString();

                //Help to continue :)

            }
        });
    }

}

Ich möchte den Text in TextView textView in die Zwischenablage kopieren, wenn die Schaltfläche bCopygedrückt wird.

Darshan Gowda
quelle
2
Mögliches Duplikat von Wie kopiere ich Text programmgesteuert in meine Android-App?
Shabbir Dhangot
stackoverflow.com/q/48791271/9274175 Bitte beantworten Sie diese Fragen auf coppy
Yash Kale

Antworten:

590

Verwenden Sie ClipboardManager

 ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);

Stellen Sie sicher, dass Sie importiert haben android.content.ClipboardManagerund NICHT android.text.ClipboardManager. Letzteres ist veraltet. Überprüfen Sie diesen Link für weitere Informationen.

Stinepike
quelle
3
Dies ist für API11 + nur nicht für GB und darunter
Javier
48
Wofür wird das "Etikett" verwendet?
Android-Entwickler
19
@androiddeveloper Erläuterung des Parameters "label": stackoverflow.com/questions/33207809/…
smg
3
@smg Also ist es mehr für Entwickler? Aber wie kommt es, dass es für Benutzer angezeigt wird?
Android-Entwickler
7
In AndroidX wird es tatsächlichClipboardManager clipboard = getSystemService(getContext(), ClipboardManager.class);
HoratioCain
72

Hier die Methode zum Kopieren von Text in die Zwischenablage:

private void setClipboard(Context context, String text) {
  if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
    android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
    clipboard.setText(text);
  } else {
    android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
    android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text);
    clipboard.setPrimaryClip(clip);
  }
}

Diese Methode funktioniert auf allen Android-Geräten.

vuhung3990
quelle
2
Ich verstehe nicht, was mit "Kontext" gemeint ist. Können Sie ein Beispiel hinzufügen, wie diese Methode ordnungsgemäß aufgerufen wird? Vielen Dank.
E_Blue
1
Es sieht auch so aus, als würde der Wert von "context" nicht verwendet. Warum muss es also als Parameter übergeben werden?
E_Blue
Hey Mann, Kontext ist in Fragment erforderlich, um getSystemService
vuhung3990
@E_Blue context.getSystemService (Context.CLIPBOARD_SERVICE) ??? Ja wirklich???
androidStud
1
@E_Blue sieht aus, als wären Sie ein naiver Android-Entwickler, der nach dem Kontext fragt. Nun, das ist auch kein Problem, aber achte nur auf deinen Ton und studiere / recherchiere auch über Dinge.
androidStud
57

Gestern habe ich diese Klasse gemacht. Nehmen wir an, es ist für alle API-Ebenen

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.net.Uri;
import android.util.Log;
import de.lochmann.nsafirewall.R;

public class MyClipboardManager {

    @SuppressLint("NewApi")
    @SuppressWarnings("deprecation")
    public boolean copyToClipboard(Context context, String text) {
        try {
            int sdk = android.os.Build.VERSION.SDK_INT;
            if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
                android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context
                        .getSystemService(context.CLIPBOARD_SERVICE);
                clipboard.setText(text);
            } else {
                android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context
                        .getSystemService(context.CLIPBOARD_SERVICE);
                android.content.ClipData clip = android.content.ClipData
                        .newPlainText(
                                context.getResources().getString(
                                        R.string.message), text);
                clipboard.setPrimaryClip(clip);
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    @SuppressLint("NewApi")
    public String readFromClipboard(Context context) {
        int sdk = android.os.Build.VERSION.SDK_INT;
        if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
            android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context
                    .getSystemService(context.CLIPBOARD_SERVICE);
            return clipboard.getText().toString();
        } else {
            ClipboardManager clipboard = (ClipboardManager) context
                    .getSystemService(Context.CLIPBOARD_SERVICE);

            // Gets a content resolver instance
            ContentResolver cr = context.getContentResolver();

            // Gets the clipboard data from the clipboard
            ClipData clip = clipboard.getPrimaryClip();
            if (clip != null) {

                String text = null;
                String title = null;

                // Gets the first item from the clipboard data
                ClipData.Item item = clip.getItemAt(0);

                // Tries to get the item's contents as a URI pointing to a note
                Uri uri = item.getUri();

                // If the contents of the clipboard wasn't a reference to a
                // note, then
                // this converts whatever it is to text.
                if (text == null) {
                    text = coerceToText(context, item).toString();
                }

                return text;
            }
        }
        return "";
    }

    @SuppressLint("NewApi")
    public CharSequence coerceToText(Context context, ClipData.Item item) {
        // If this Item has an explicit textual value, simply return that.
        CharSequence text = item.getText();
        if (text != null) {
            return text;
        }

        // If this Item has a URI value, try using that.
        Uri uri = item.getUri();
        if (uri != null) {

            // First see if the URI can be opened as a plain text stream
            // (of any sub-type). If so, this is the best textual
            // representation for it.
            FileInputStream stream = null;
            try {
                // Ask for a stream of the desired type.
                AssetFileDescriptor descr = context.getContentResolver()
                        .openTypedAssetFileDescriptor(uri, "text/*", null);
                stream = descr.createInputStream();
                InputStreamReader reader = new InputStreamReader(stream,
                        "UTF-8");

                // Got it... copy the stream into a local string and return it.
                StringBuilder builder = new StringBuilder(128);
                char[] buffer = new char[8192];
                int len;
                while ((len = reader.read(buffer)) > 0) {
                    builder.append(buffer, 0, len);
                }
                return builder.toString();

            } catch (FileNotFoundException e) {
                // Unable to open content URI as text... not really an
                // error, just something to ignore.

            } catch (IOException e) {
                // Something bad has happened.
                Log.w("ClippedData", "Failure loading text", e);
                return e.toString();

            } finally {
                if (stream != null) {
                    try {
                        stream.close();
                    } catch (IOException e) {
                    }
                }
            }

            // If we couldn't open the URI as a stream, then the URI itself
            // probably serves fairly well as a textual representation.
            return uri.toString();
        }

        // Finally, if all we have is an Intent, then we can just turn that
        // into text. Not the most user-friendly thing, but it's something.
        Intent intent = item.getIntent();
        if (intent != null) {
            return intent.toUri(Intent.URI_INTENT_SCHEME);
        }

        // Shouldn't get here, but just in case...
        return "";
    }

}
WIE
quelle
Können Sie die erforderlichen Importanweisungen hinzufügen, damit diese Klasse funktioniert?
merlin2011
@ merlin2011 hat es geschafft, denke ich habe die coerceToText (...) Methode vergessen. Sry dafür
AS
Was macht "coerceToText"? Ist es auch möglich, andere Datentypen in die Zwischenablage zu kopieren / einzufügen (Beispiel: Bitmap)?
Android-Entwickler
1
@AS warum hast du die corceToText Methode selbst geschrieben? ! Es ist bereits mit API verfügbar, siehe developer.android.com/reference/android/content/…
Hardik
Aber ich denke, es gibt Zeit für Entwickler, die Unterstützung für API17 einzustellen. Es gibt nicht mehr viele Einheiten älterer Typen und sie neigen nicht dazu, neue Apps herunterzuladen? Zum Beispiel benutze ich ältere Einheiten für die Navigation in meinem Segelboot und alles andere wird abgewischt. Es macht mir nichts aus, solche Einheiten versehentlich über Bord zu werfen?
Jan Bergström
23

Als praktische Kotlin-Erweiterung:

fun Context.copyToClipboard(text: CharSequence){
    val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clip = ClipData.newPlainText("label",text)
    clipboard.primaryClip = clip
}

Aktualisieren:

Wenn Sie ContextCompat verwenden, sollten Sie Folgendes verwenden:

ContextCompat.getSystemService(this, ClipboardManager::class.java)
Crgarridos
quelle
1
API wurde jetzt in clipboardManager = getSystemService (Kontext, ClipboardManager :: class.java) geändert
Per Christian Henden
Es hat sich tatsächlich geändert, context.getSystemService(ClipboardManager::class.java)sodass Sie auf eine ContextCompat-Signatur verweisen, nicht wahr? Vielen Dank für das Feedback
Crgarridos
13

Verwenden Sie einfach diese. Es funktioniert nur für Android API> = 11, bevor Sie eine ClipData verwenden müssen.

ClipboardManager _clipboard = (ClipboardManager) _activity.getSystemService(Context.CLIPBOARD_SERVICE);
_clipboard.setText(YOUR TEXT);

Hoffe es hat dir geholfen :)

[UPDATE 19.03.2015] Genau wie Ujjwal Singh sagte, dass die Methode setTextjetzt veraltet ist, sollten Sie setPrimaryClip (clipData) verwenden, genau wie in den Dokumenten empfohlen.

Ektos974
quelle
1
Das ist der Name meiner Variablen. Wenn Sie auf Ihrer Aktivität sind, verwenden Sie einfach (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE); _clipboard.setText(YOUR TEXT);
Ektos974
1
Veraltete - nicht verwenden setTextVerwendung ClipData+setPrimaryClip
Ujjwal Singh
1
Für mich zeigt es auch Fehler bei der Verwendung von setPrimaryClip
Praneeth
11

Dies kann in Kotlin folgendermaßen erfolgen:

var clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
var clip = ClipData.newPlainText("label", file.readText())
clipboard.primaryClip = clip

Wo file.readText()ist deine Eingabezeichenfolge?

Nikhil Katekhaye
quelle
7

Verwenden Sie diesen Code

   private ClipboardManager myClipboard;
   private ClipData myClip;
   TextView textView;
   Button copyText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainpage);
    textView = (TextView) findViewById(R.id.textview);
    copyText = (Button) findViewById(R.id.bCopy);
    myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);

    copyText.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub


           String text = textView.getText().toString();
           myClip = ClipData.newPlainText("text", text);
           myClipboard.setPrimaryClip(myClip);
           Toast.makeText(getApplicationContext(), "Text Copied", 
           Toast.LENGTH_SHORT).show(); 
        }
    });
}
SKG
quelle
Vielen Dank, es ist sehr einfach zu bedienen.
iamkdblue
7

Verwenden Sie diese Funktion zum Kopieren in die Zwischenablage

public void copyToClipboard(String copyText) {
    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(copyText);
    } else {
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager)
                getSystemService(Context.CLIPBOARD_SERVICE);
        android.content.ClipData clip = android.content.ClipData
                .newPlainText("Your OTP", copyText);
        clipboard.setPrimaryClip(clip);
    }
    Toast toast = Toast.makeText(getApplicationContext(),
            "Your OTP is copied", Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT, 50, 50);
    toast.show();
    //displayAlert("Your OTP is copied");
}
Vimal Gajera
quelle
6
@SuppressLint({ "NewApi", "NewApi", "NewApi", "NewApi" })
@SuppressWarnings("deprecation")
@TargetApi(11)
public void onClickCopy(View v) {   // User-defined onClick Listener
    int sdk_Version = android.os.Build.VERSION.SDK_INT;
    if(sdk_Version < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        clipboard.setText(textView.getText().toString());   // Assuming that you are copying the text from a TextView
        Toast.makeText(getApplicationContext(), "Copied to Clipboard!", Toast.LENGTH_SHORT).show();
    }
    else { 
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
        android.content.ClipData clip = android.content.ClipData.newPlainText("Text Label", textView.getText().toString());
        clipboard.setPrimaryClip(clip);
        Toast.makeText(getApplicationContext(), "Copied to Clipboard!", Toast.LENGTH_SHORT).show();
    }   
}
Himanshu Aggarwal
quelle
2

int sdk = android.os.Build.VERSION.SDK_INT;

    if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) DetailView.this
                .getSystemService(Context.CLIPBOARD_SERVICE);
        clipboard.setText("" + yourMessage.toString());
        Toast.makeText(AppCstVar.getAppContext(),
                "" + getResources().getString(R.string.txt_copiedtoclipboard),
                Toast.LENGTH_SHORT).show();
    } else {
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) DetailView.this
                .getSystemService(Context.CLIPBOARD_SERVICE);
        android.content.ClipData clip = android.content.ClipData
                .newPlainText("message", "" + yourMessage.toString());
        clipboard.setPrimaryClip(clip);
        Toast.makeText(AppCstVar.getAppContext(),
                "" + getResources().getString(R.string.txt_copiedtoclipboard),
                Toast.LENGTH_SHORT).show();
    }
Pankaj Singh
quelle
2

Verwenden Sie diese Methode:

 ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);

An der Stelle von setPrimaryClip können wir auch die folgenden Methoden verwenden:

void    clearPrimaryClip()

Löscht alle aktuellen primären Clips in der Zwischenablage.

ClipData    getPrimaryClip()

Gibt den aktuellen primären Clip in der Zwischenablage zurück.

ClipDescription getPrimaryClipDescription()

Gibt eine Beschreibung des aktuellen primären Clips in der Zwischenablage zurück, jedoch keine Kopie seiner Daten.

CharSequence    getText()

Diese Methode ist veraltet. Verwenden Sie stattdessen getPrimaryClip (). Dadurch wird der primäre Clip abgerufen und versucht, ihn zu einer Zeichenfolge zu zwingen.

boolean hasPrimaryClip()

Gibt true zurück, wenn sich derzeit ein primärer Clip in der Zwischenablage befindet.

Pradeep Kumar
quelle
1
    String stringYouExtracted = referraltxt.getText().toString();
    android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
    android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", stringYouExtracted);

clipboard.setPrimaryClip(clip);
        Toast.makeText(getActivity(), "Copy coupon code copied to clickboard!", Toast.LENGTH_SHORT).show();
Keshav Gera
quelle
0

Versuchen Sie den folgenden Code. Es wird die neueste API unterstützen:

ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
                        if (clipboard.hasPrimaryClip()) {
                            android.content.ClipDescription description = clipboard.getPrimaryClipDescription();
                            android.content.ClipData data = clipboard.getPrimaryClip();
                            if (data != null && description != null && description.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN))
                            {
                                String url= (String) clipboard.getText();
                                searchText.setText(url);
                                System.out.println("data="+data+"description="+description+"url="+url);
                            }}
Ranjith Guru
quelle
0

Kotlin-Hilfsmethode zum Anhängen von Click-to-Copy-Texten in einer Textansicht

Fügen Sie diese Methode irgendwo in die Util-Klasse ein. Diese Methode hängt den Klick-Listener in der Textansicht an, um den Inhalt von textView in einen clipText zu kopieren, wenn Sie auf diese textView klicken

/**
 * Param:  cliplabel, textview, context
 */
fun attachClickToCopyText(textView: TextView?, clipLabel: String, context: Context?) {
    if (textView != null && null != context) {
        textView.setOnClickListener {
            val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
            val clip = ClipData.newPlainText(clipLabel, textView!!.text)
            clipboard.primaryClip = clip
            Snackbar.make(textView,
                    "Copied $clipLabel", Snackbar.LENGTH_LONG).show()
        }
    }

}
Hitesh Sahu
quelle
0

Sie können diese Funktion zum Kopieren in die Zwischenablage ausführen, wenn Sie auf eine Schaltfläche klicken. Fügen Sie diese Codezeilen in Ihre Schaltfläche auf ClickListerner ein

android.content.ClipboardManager clipboardManager = (android.content.ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clipData = android.content.ClipData.newPlainText("Text Label", ViewPass.getText().toString());
clipboardManager.setPrimaryClip(clipData);
Toast.makeText(getApplicationContext(),"Copied from Clipboard!",Toast.LENGTH_SHORT).show();
Malith Ileperuma
quelle
0

Schreiben Sie einfach diesen Code:

clipboard.setText(getstring);
raza raza
quelle
Sie haben vergessen zu initialisieren clipboard. Aber danke dafür setText. Es ist veraltet, also verwenden val clip = ClipData.newPlainText(null, text) clipboard.setPrimaryClip(clip).
CoolMind
-1

Für Kotlin

 ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);
Kapil Bansal
quelle