Bagaimana cara menyalin teks ke papan klip di Android?

313

Adakah yang bisa tolong beri tahu saya cara menyalin teks yang ada dalam tampilan teks tertentu ke papan klip saat tombol ditekan?

    @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 :)

            }
        });
    }

}

Saya ingin menyalin Teks di TextView textView ke clipboard ketika Tombol bCopyditekan.

Darshan Gowda
sumber
2
Kemungkinan duplikat dari Cara menyalin teks secara terprogram di aplikasi Android saya?
Shabbir Dhangot
stackoverflow.com/q/48791271/9274175 Harap jawab pertanyaan ini dalam diska
Yash Kale

Jawaban:

590

gunakan ClipboardManager

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

pastikan Anda telah mengimpor android.content.ClipboardManagerdan BUKAN android.text.ClipboardManager. Akhir sudah ditinggalkan. Periksa tautan ini untuk informasi lebih lanjut.

stinepike
sumber
3
Ini untuk API11 + hanya tidak berfungsi untuk GB dan di bawah
Javier
48
Untuk apa "label" digunakan?
pengembang android
19
@androiddeveloper Penjelasan parameter "label": stackoverflow.com/questions/33207809/…
smg
3
@smg Jadi lebih untuk pengembang? Tapi bagaimana bisa dikatakan itu ditampilkan untuk pengguna?
pengembang android
7
Di androidx sebenarnya menjadiClipboardManager clipboard = getSystemService(getContext(), ClipboardManager.class);
HoratioCain
72

Di sini metode untuk menyalin teks ke clipboard:

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

Metode ini berfungsi pada semua perangkat android.

vuhung3990
sumber
2
Saya tidak mengerti apa yang dimaksud dengan "konteks". Bisakah Anda menambahkan contoh cara memanggil metode itu dengan benar? Terima kasih.
E_Blue
1
Juga sepertinya nilai "konteks" tidak digunakan. Jadi mengapa harus dilewatkan sebagai parameter?
E_Blue
hey guy, konteks diperlukan dalam fragmen untuk memanggil getSystemService
vuhung3990
@E_Blue context.getSystemService (Context.CLIPBOARD_SERVICE) ??? Betulkah???
androidStud
1
@E_Blue sepertinya Anda adalah pengembang android naif yang bertanya tentang konteks. Yah itu juga bukan masalah, tapi pikirkan saja nada bicaramu dan lakukan penelitian / penelitian tentang berbagai hal juga.
androidStud
57

Kemarin saya membuat kelas ini. Ambillah, itu untuk semua Level API

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

}
SEBAGAI
sumber
Bisakah Anda menambahkan pernyataan impor yang diperlukan untuk membuat kelas ini berfungsi?
merlin2011
@ merlin2011 melakukannya, saya pikir saya lupa metode coerceToText (...). Sry for that
AS
Apa yang dilakukan "coerceToText"? juga, apakah mungkin untuk menyalin / menempelkan tipe data lain ke clipboard (contoh: bitmap)?
pengembang android
1
@ APAKAH Anda menulis metode corceToText sendiri? ! sudah tersedia dengan api, lihat developer.android.com/reference/android/content/…
Hardik
Tapi saya pikir ada waktu bagi pengembang untuk berhenti mendukung hal-hal sebelumnya tentang API17. Tidak banyak unit yang tersisa dari tipe yang lebih tua dan mereka cenderung tidak mengunduh aplikasi baru? Misalnya saya menggunakan unit yang lebih tua untuk navigasi di perahu layar saya, dan yang lainnya dihapus. Saya tidak keberatan melempar unit seperti itu tanpa sengaja?
Jan Bergström
23

Sebagai ekstensi kotlin yang berguna:

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

Memperbarui:

Jika Anda menggunakan ContextCompat Anda harus menggunakan:

ContextCompat.getSystemService(this, ClipboardManager::class.java)
crgarridos
sumber
1
API sekarang telah berubah menjadi clipboardManager = getSystemService (konteks, ClipboardManager :: class.java)
Per Christian Henden
itu benar-benar berubah menjadi context.getSystemService(ClipboardManager::class.java)Anda menunjuk ke tanda tangan ContextCompat bukan? Terima kasih atas umpan baliknya
crgarridos
13

Gunakan ini saja. Ini hanya berfungsi untuk android api> = 11 sebelum itu Anda harus menggunakan ClipData.

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

Semoga ini bisa membantu Anda :)

[UPDATE 3/19/2015] Seperti yang dikatakan Ujjwal Singh , metode setTextini sudah tidak digunakan lagi, Anda harus menggunakan, seperti halnya dokumen yang menyarankannya , setPrimaryClip (clipData)

Ektos974
sumber
1
Itu nama variabel saya. Jika Anda berada di Aktivitas Anda, gunakan saja (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE); _clipboard.setText(YOUR TEXT);
Ektos974
1
Sudah usang - jangan gunakan setTextgunakan ClipData+setPrimaryClip
Ujjwal Singh
1
Bagi saya juga itu menunjukkan kesalahan saat menggunakan setPrimaryClip
Praneeth
11

Ini bisa dilakukan di Kotlin seperti ini:

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

Di mana file.readText()string masukan Anda.

Nikhil Katekhaye
sumber
7

gunakan kode ini

   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
sumber
Terima kasih banyak, ini sangat mudah digunakan.
iamkdblue
7

gunakan fungsi ini untuk menyalin ke papan klip

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");
}
Gajera Vimal
sumber
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
sumber
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
sumber
2

gunakan metode ini:

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

di tempat setPrimaryClip kita juga bisa menggunakan metode berikut:

void    clearPrimaryClip()

Menghapus semua klip utama saat ini di clipboard.

ClipData    getPrimaryClip()

Mengembalikan klip utama saat ini di clipboard.

ClipDescription getPrimaryClipDescription()

Mengembalikan deskripsi klip utama saat ini di clipboard tetapi bukan salinan datanya.

CharSequence    getText()

Metode ini sudah usang. Gunakan getPrimaryClip () sebagai gantinya. Ini mengambil klip utama dan mencoba memaksanya ke string.

boolean hasPrimaryClip()

Mengembalikan nilai true jika saat ini ada klip utama di clipboard.

Pradeep Kumar
sumber
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
sumber
0

Coba kode berikut. Ini akan mendukung API terbaru:

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
sumber
0

Metode pembantu Kotlin untuk melampirkan klik untuk menyalin Teks pada TextView

Letakkan metode ini di suatu tempat di kelas Util. Metode ini melampirkan listener klik pada tampilan teks untuk Menyalin Konten textView ke clipText pada klik textView itu

/**
 * 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
sumber
0

Anda dapat melakukan fungsi salin ke clipboard ini saat acara tombol klik. jadi letakkan baris kode ini di dalam tombol onClickListerner Anda

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
sumber
0

Cukup tulis kode ini:

clipboard.setText(getstring);
raza raza
sumber
Anda lupa menginisialisasi clipboard. Tapi terima kasih untuk setText. Itu sudah usang, jadi gunakan val clip = ClipData.newPlainText(null, text) clipboard.setPrimaryClip(clip).
CoolMind
-1

Untuk Kotlin

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