Android uygulamama programlı olarak metin nasıl kopyalanır?


231

Bir Android uygulaması oluşturuyorum ve bir EditText widget'ının metin değerini kopyalamak istiyorum. Basına kullanıcı olması mümkündür Menu+Aardından Menu+Cdeğerini kopyalamak için, ama ben programlı bunu nasıl?



Bu temel olarak şu sorunun bir sorusudur: stackoverflow.com/a/13517876/2116185
user2116185

Yanıtlar:


419

ClipboardManager#setPrimaryClipYöntemi kullanın :

import android.content.ClipboardManager;

// ...

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

ClipboardManager API referansı


7
Kullanımimport android.content.ClipboardManager;
MatheusJardimB

Bu işlev API 11+ (lolipop dahil) üzerinde çalışıyor mu?
Eşref Alshahawy

22
Nedir label?
Alaa M.

Klip Tepsisi görünmeden bunu yapmanın bir yolu var mı ? (LG G4S 5.1.1)
Alaa M.

2
kopyaladıktan sonra kullanıcıya metnin kopyalandığını bildirmek için başarı mesajı da ekleyebilirsinizContext context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Shady Sherif

217

Herkes bunun nasıl yapılması gerektiğine katılıyor, ancak kimse tam bir çözüm vermek istemediğinden, işte gidiyor:

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

Manifest'te aşağıdaki gibi bir şeyiniz olduğunu varsayıyorum:

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

Derleyici bir hata atar çünkü çalışmaz: Çağrı API seviye 11 gerektirir (geçerli min 7'dir): android.content.ClipboardManager # setPrimaryClip line 245 Android Lint Problemi.
JavaRunner

2
Manifestinize target ve min sdk eklediniz mi? Evet ise tüy bırakma uyarısını devre dışı bırakın.
Warpzit

4
@SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("kullanımdan kaldırma"), @TargetApi (11) ........ Ben de öyle yaptım ve işe yarıyor.
RRTW

2
Herkes tam kullanımı ne olduğunu söyleyebilir labeliçinde newPlainTextyöntemle? belgesel diyor label User-visible label for the clip data.. Ancak kullanıcı ne zaman labelgörünür? Ve ne tür bir değer / isim girmeliyim label?
shadyinside

@tannerjohn Tahminimce bir yerde kullanılan bir tür önizleme. Ama nerede olduğunu bilmiyorum. Ama aynı metni iki kez kullanabilirsiniz ...
Warpzit

15

Googling sizi android.content.ClipboardManager'a getiriyor ve benim yaptığım gibi Pano'nun API <11'de kullanılamayacağına karar verebilirsiniz, çünkü dokümantasyon sayfasında "Başlangıç: API Seviye 11" yazıyor.

Aslında iki sınıf var, ikincisi ilkini genişletiyor - android.text.ClipboardManager ve android.content.ClipboardManager.

android.text.ClipboardManager API 1'den beri var, ancak yalnızca metin içeriğiyle çalışıyor.

android.content.ClipboardManager pano ile çalışmanın tercih edilen yoludur, ancak API Seviye <11'de (Honeycomb) kullanılamaz.

Bunlardan herhangi birini almak için aşağıdaki koda ihtiyacınız vardır:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Ancak API <11 için içe aktarmanız android.text.ClipboardManagerve API için> = 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());
}

bunu deneyebilirsiniz ..


8

EditText'ten bazı kopyala ve yapıştır işlevlerini uygulamak için bazı kodlar (sürüm kontrolü için Warpzit sayesinde). Bunları düğmenizin onclick etkinliğine bağlayabilirsiniz.

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

Yaptığınız gibi yazmadan android'in kopyala / yapıştır / kes yöntemlerini çağırmak mümkün değil mi? Kullanıcının seçili bir metni kalın / italik / alt çizgi vb. Yapabilmesi için işlevselliğe sahip özel bir metin seçimi araç çubuğu yaptım, ancak özelleştirmeden sonra kopyala / yapıştır / kes varsayılan işlevleri artık çalışmıyor, ancak hala görünüyorlar mı?

"WordKeeper" ne işe yarar?
android geliştirici

7

Android destek kitaplığı güncellemesi

Android Oreo'dan itibaren, destek kitaplığı yalnızca API 14'e kadar gider. Çoğu yeni uygulamanın muhtemelen 14 API'sı vardır ve bu nedenle diğer cevapların bazılarında bahsedilen API 11 ile ilgili sorunlar hakkında endişelenmenize gerek yoktur. Kodun çoğu temizlenebilir. (Yine de daha düşük sürümleri destekliyorsanız düzenleme geçmişime bakın.)

kopya

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

Yapıştırmak

Bu kodu bonus olarak ekliyorum çünkü kopyala / yapıştır genellikle çiftler halinde yapılıyor.

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

notlar

  • android.content.ClipboardManagerEski yerine sürümü içe aktardığınızdan emin olun android.text.ClipboardManager. Aynı ClipData.
  • Bir aktivitede değilseniz, hizmeti alabilirsiniz context.getSystemService().
  • Yapıştırma metnini almak için bir try / catch bloğu kullandım çünkü birden fazla şey olabilir null. Eğer daha okunaklı bulursanız, her birini kontrol edebilirsiniz.

1
"Metin etiketi" ne işe yarar?
android geliştirici

@androiddeveloper, etiketi aslında hiçbir şey için kullanmadım, ancak bu Soru ve Cevaplara bakın .
Suragch

Bu yüzden kullanıcılar tarafından görülebileceğini söylese de, aslında değildir ve gerekirse geliştiricilerin kullanımına bağlıdır.
android geliştirici

5

TextView için standart kopyala / yapıştır özelliğini etkinleştirmek için U aşağıdakilerden birini seçebilir:

Düzen dosyasında değişiklik: TextView'inize aşağıdaki özelliği ekleyin

android:textIsSelectable="true"

Java sınıfınızda bu satırı iki dilbilgisi olarak yazın.

myTextView.setTextIsSelectable(true);

TextView üzerine uzun bastığınızda kopyalama / yapıştırma eylem çubuğunu görebilirsiniz.


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

Ve içe aktar import android.content.ClipboardManager;


3

@FlySwat zaten doğru cevabı verdi, ben sadece tam cevabı paylaşıyorum:

ClipboardManager.setPrimaryClip ( http://developer.android.com/reference/android/content/ClipboardManager.html ) yöntemini kullanın :

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

label Klip verileri için Kullanıcı tarafından görülebilir bir etiket nerede ve klipteki textgerçek metindir. Resmi belgelere göre .

Bu içe aktarmayı kullanmak önemlidir:

import android.content.ClipboardManager;

Cevapları neden kopyalayıp yapıştırıyorsunuz? Etiket nedir?
AlexS

Dediğim gibi @AlexS, başka bir arkadaş zaten doğru bir cevap verdi, sadece daha fazla ayrıntı içeren başka bir yol gönderiyorum, bence birisi için yararlı olacak
Trinity

1

İşte benim çalışma kodum

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

    }
}

Bir kodu paylaştığınızda, açıklamaya çalışın. Bir soruyu nasıl yanıtlayacağınızı ziyaret edebilir ve kontrol edebilirsiniz .
Yunus Temurlenk

@YunusTemurlenk Önerileriniz için teşekkürler, bir dahaki sefere cevaplarımı bir açıklama ile düzenleyeceğim
Mehul Boghra

1

Kotlin için aşağıdaki yöntemi kullanabiliriz. Bu yöntemi bir etkinliğin veya parçanın içine yapıştırabilirsiniz.

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

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

}

Teşekkür ederim! context.Bir parçası içinde yapıyorum çünkü olabilir - Ben eksikti parçasıydı.
Cullub
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.