Bagaimana cara menyalin teks secara terprogram di aplikasi Android saya?

231

Saya sedang membangun aplikasi Android dan saya ingin menyalin nilai teks dari widget EditText. Adalah mungkin bagi pengguna untuk menekan Menu+Akemudian Menu+Cmenyalin nilainya, tetapi bagaimana saya akan melakukan ini secara terprogram?

Zach
sumber
Ini pada dasarnya adalah pertanyaan duplikat: stackoverflow.com/a/13517876/2116185
user2116185

Jawaban:

419

Gunakan ClipboardManager#setPrimaryClipmetode:

import android.content.ClipboardManager;

// ...

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

ClipboardManager Referensi API

FlySwat
sumber
7
Gunakanimport android.content.ClipboardManager;
MatheusJardimB
Apakah fungsi ini berfungsi pada API 11+ (termasuk lollipop) atau tidak?
Ashraf Alshahawy
22
Apa label?
Alaa M.
2
Anda juga dapat menambahkan pesan sukses setelah penyalinan untuk memberi tahu pengguna bahwa teks tersebut disalinContext context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Shady Sherif
1
@AlaaM. Saya pikir baki klip ini adalah opsi dari LG dan Anda tidak dapat mengendalikannya
Shady Sherif
217

Jadi semua orang sepakat tentang bagaimana ini harus dilakukan, tetapi karena tidak ada yang mau memberikan solusi lengkap, begini:

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

Saya berasumsi Anda memiliki sesuatu seperti berikut yang dinyatakan dalam manifes:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
Warpzit
sumber
Itu tidak berfungsi, karena kompiler membuat kesalahan: Panggilan memerlukan API level 11 (min saat ini adalah 7): android.content.ClipboardManager # setPrimaryClip line 245 Android Lint Problem.
JavaRunner
2
Apakah Anda menambahkan target dan min sdk ke manifes Anda? Jika ya, nonaktifkan peringatan serat.
Warpzit
4
Tambahkan 3 baris berikut di atas metode Anda @SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("deprecation"), @TargetApi (11) ........ . Itulah yang saya lakukan, dan itu berhasil.
RRTW
2
Adakah yang bisa memberi tahu saya apa sebenarnya penggunaan metode labelin newPlainText? status dokumentasi label User-visible label for the clip data.. Tetapi kapan hal itu labelterlihat oleh pengguna? Dan nilai / nama apa yang harus saya masukkan label?
shadyinside
@tannerjohn Tebakan saya adalah semacam pratinjau yang digunakan di suatu tempat. Tapi saya tidak tahu di mana. Tapi Anda bisa menggunakan teks yang sama dua kali ...
Warpzit
15

Googling membawa Anda ke android.content.ClipboardManager dan Anda dapat memutuskan, seperti yang saya lakukan, bahwa Clipboard tidak tersedia di API <11, karena halaman dokumentasi mengatakan "Sejak: API Level 11".

Sebenarnya ada dua kelas, yang kedua memperpanjang yang pertama - android.text.ClipboardManager dan android.content.ClipboardManager.

android.text.ClipboardManager sudah ada sejak API 1, tetapi hanya berfungsi dengan konten teks.

android.content.ClipboardManager adalah cara yang disukai untuk bekerja dengan clipboard, tetapi itu tidak tersedia di API Level <11 (Honeycomb).

Untuk mendapatkannya, Anda memerlukan kode berikut:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Tetapi untuk API <11 Anda harus mengimpor android.text.ClipboardManagerdan untuk API> = 11 android.content.ClipboardManager

Viachaslau Tysianchuk
sumber
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());
}

kamu bisa coba ini ..

ayrina
sumber
8

Berikut adalah beberapa kode untuk mengimplementasikan beberapa fungsi salin dan tempel dari EditText (terima kasih kepada Warpzit untuk pemeriksaan versi). Anda dapat mengaitkan ini ke acara klik tombol Anda.

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());
        }
    }
}
cinta hidup
sumber
Apakah tidak mungkin memanggil metode salin / tempel / potong android tanpa menuliskannya seperti yang Anda lakukan? Saya membuat bilah alat pemilihan teks khusus dengan fungsi untuk pengguna agar dapat membuat teks yang dipilih menjadi tebal / miring / garis bawah dll. Tetapi setelah penyesuaian, fungsi default salin / tempel / potong tidak berfungsi lagi, tetapi ikon untuk mereka masih muncul?
Untuk apa "WordKeeper"?
pengembang android
7

Pembaruan perpustakaan dukungan Android

Pada Android Oreo, perpustakaan dukungan hanya turun ke API 14. Sebagian besar aplikasi yang lebih baru mungkin juga memiliki min API 14, dan dengan demikian tidak perlu khawatir tentang masalah dengan API 11 yang disebutkan dalam beberapa jawaban lain. Banyak kode dapat dibersihkan. (Tetapi lihat riwayat edit saya jika Anda masih mendukung versi yang lebih rendah.)

Menyalin

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

Tempel

Saya menambahkan kode ini sebagai bonus, karena salin / tempel biasanya dilakukan berpasangan.

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

Catatan

  • Pastikan untuk mengimpor android.content.ClipboardManagerversi daripada yang lama android.text.ClipboardManager. Sama untukClipData .
  • Jika Anda tidak dalam suatu kegiatan Anda bisa mendapatkan layanan context.getSystemService() .
  • Saya menggunakan blok try / catch untuk mendapatkan teks tempel karena banyak hal bisa terjadi null. Anda dapat memeriksa masing-masing jika Anda menemukan cara lebih mudah dibaca.
Suragch
sumber
1
Untuk apa "label teks"?
pengembang android
@androiddeveloper, saya sebenarnya tidak pernah menggunakan label untuk apa pun, tetapi lihat T&J ini .
Suragch
Jadi meskipun dikatakan itu terlihat oleh pengguna, sebenarnya tidak, dan tergantung pada pengembang untuk menggunakannya jika diperlukan.
pengembang android
5

Untuk mengaktifkan salin / tempel standar untuk TextView, Anda dapat memilih salah satu dari yang berikut:

Ubah file tata letak: tambahkan properti di bawah ini ke TextView Anda

android:textIsSelectable="true"

Di kelas Java Anda, tulis baris ini dua set secara tata bahasa.

myTextView.setTextIsSelectable(true);

Dan tekan lama pada TextView Anda dapat melihat copy / paste action bar.

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

Dan impor import android.content.ClipboardManager;

Mor2
sumber
3

@FlySwat sudah memberikan jawaban yang benar, saya hanya membagikan jawaban yang lengkap:

Gunakan metode 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); 

Di mana label label yang dapat dilihat pengguna untuk data klip dan textmerupakan teks aktual dalam klip. Menurut dokumen resmi .

Penting untuk menggunakan impor ini:

import android.content.ClipboardManager;
Trinitas
sumber
Mengapa Anda menyalin \ rekatkan jawaban? Apa itu label?
AlexS
@AlexS seperti yang saya katakan, teman lain sudah memberikan jawaban yang benar, saya hanya memposting cara lain dengan lebih detail, saya pikir itu akan berguna bagi seseorang
Trinity
1

Ini kode kerja saya

/**
 * 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
sumber
Ketika Anda membagikan kode, cobalah menjelaskannya. Anda dapat mengunjungi dan memeriksa cara menjawab pertanyaan .
Yunus Temurlenk
@YunusTemurlenk Terima kasih atas saran Anda, lain kali saya akan mengedit jawaban saya dengan deskripsi
Mehul Boghra
1

Untuk Kotlin, kita dapat menggunakan metode berikut. Anda dapat menempelkan metode ini di dalam suatu aktivitas atau fragmen.

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
sumber
Terima kasih! Itu context.adalah bagian yang saya lewatkan - bisa jadi karena saya melakukannya dalam sebuah fragmen.
Cullub