Android'de Pano Klip Metin Nasıl Kopyalanır?


313

Birisi bana bir düğmeye basıldığında belirli bir metin görünümünde bulunan metnin panoya nasıl kopyalanacağını söyleyebilir mi?

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

            }
        });
    }

}

bCopyDüğmeye basıldığında TextView textView içindeki metni panoya kopyalamak istiyorum .



stackoverflow.com/q/48791271/9274175 Lütfen bu soruyu cevaplayın coppy
Yash Kale

Yanıtlar:


590

ClipboardManager kullanın

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

emin olun ithal android.content.ClipboardManagerve değil android.text.ClipboardManager. İkincisi kullanımdan kaldırıldı. Daha fazla bilgi için bu bağlantıyı kontrol edin .


3
Bu, API11 + için sadece GB ve altında çalışmaz
Javier

48
"Etiket" ne için kullanılır?
android geliştirici

19
@androiddeveloper "label" parametresinin açıklaması: stackoverflow.com/questions/33207809/…
smg

3
@smg Yani geliştiriciler için daha mı fazla? Ancak, kullanıcılar için gösterildiğini nasıl söylüyor?
android geliştirici

7
Androidx'te aslında olurClipboardManager clipboard = getSystemService(getContext(), ClipboardManager.class);
HoratioCain

72

Metni panoya kopyalama yöntemi:

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

Bu yöntem tüm android cihazlarda çalışıyor.


2
"Bağlam" ile ne anlama geldiğini anlamıyorum. Bu yöntemi doğru şekilde çağırmanın bir örneğini ekleyebilir misiniz? Teşekkürler.
E_Blue

1
Ayrıca "bağlam" değerinin kullanılmadığı anlaşılıyor. Öyleyse neden parametre olarak iletilmeli?
E_Blue

hey adam, getSystemService aramak için parça halinde bağlam gereklidir
vuhung3990

@E_Blue context.getSystemService (Context.CLIPBOARD_SERVICE) ??? Gerçekten mi???
androidStud

1
@E_Blue, bağlam hakkında soru soran saf bir android geliştiricisi gibi görünüyor. Bu da bir sorun değil, sadece tonunuza dikkat edin ve bazı şeyler hakkında da çalışma / araştırma yapın.
androidStud

57

Dün bu sınıfı yaptım. Al, tüm API Seviyeleri için

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

}

Bu sınıfın çalışması için gerekli ithalat ifadelerini ekleyebilir misiniz?
merlin2011

@ merlin2011 yaptı, düşünüyorum coerceToText (...) yöntemini unuttum. Bunun için Sry
AS

"CoerceToText" ne yapar? Ayrıca, diğer veri türlerini panoya kopyalamak / yapıştırmak mümkün müdür (örnek: bitmap)?
android geliştirici

1
@AS neden corceToText yöntemini yazdınız? ! zaten api ile kullanılabilir bkz. developer.android.com/reference/android/content/…
Hardik

Ancak, geliştiricilerin API17 hakkında daha önce desteklemeyi bırakmaları için zaman olduğunu düşünüyorum. Eski türlerden çok fazla birim kalmadı ve yeni uygulamalar indirme eğilimi yok mu? Örneğin, yelkenli teknemde navigasyon için yaşlı birimleri kullanıyorum ve diğer her şey siliniyor. Bu tür birimleri yanlışlıkla gemiye atmayı umursamıyorum?
Jan Bergström

23

Kullanışlı bir kotlin uzantısı olarak:

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

Güncelleme:

ContextCompat kullanıyorsanız şunları kullanmalısınız:

ContextCompat.getSystemService(this, ClipboardManager::class.java)

1
API artık clipboardManager = getSystemService (içerik, ClipboardManager :: class.java) olarak değiştirildi
Per Christian Henden

aslında context.getSystemService(ClipboardManager::class.java)bir ContextCompat imzasını işaret ediyor olarak değişti değil mi? Geri bildiriminiz için teşekkürler
crgarridos

13

Sadece bunu kullan. Bir ClipData kullanmanız gerekmeden önce sadece android api> = 11 için çalışır.

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

Umarım sana yardımcı olmuştur :)

[UPDATE 3/19/2015] Tıpkı Ujjwal Singh'in yöntemin setTextartık kullanımdan kaldırıldığını söylediği gibi , tıpkı dokümanların önerdiği gibi, setPrimaryClip (clipData)


1
Bu benim değişkenimin adı. Faaliyetinizdeyseniz kullanın (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE); _clipboard.setText(YOUR TEXT);
Ektos974

1
Kullanımdan kaldırıldı - setTextkullanım ClipData+ kullanmayınsetPrimaryClip
Ujjwal Singh

1
Benim için de setPrimaryClip kullanırken hata gösteriyor
Praneeth

11

Bu Kotlin'de şu şekilde yapılabilir:

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

file.readText()Giriş dizeniz nerede .


7

bu kodu kullan

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

Çok teşekkürler, kullanımı çok kolay.
iamkdblue

7

panoya kopyalamak için bu işlevi kullan

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

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

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

2

bu yöntemi kullanın:

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

setPrimaryClip yerine aşağıdaki yöntemleri de kullanabiliriz:

void    clearPrimaryClip()

Panodaki geçerli herhangi bir birincil klibi temizler.

ClipData    getPrimaryClip()

Panodaki geçerli birincil klibi döndürür.

ClipDescription getPrimaryClipDescription()

Panodaki geçerli birincil klibin açıklamasını döndürür ancak verilerinin bir kopyasını döndürmez.

CharSequence    getText()

Bu yöntem kullanımdan kaldırıldı. Bunun yerine getPrimaryClip () öğesini kullanın. Bu, birincil klibi alır ve bir dizeye zorlamaya çalışır.

boolean hasPrimaryClip()

Panoda şu anda birincil bir klip varsa true değerini döndürür.


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

0

Aşağıdaki kodu deneyin. En yeni API'yı destekleyecektir:

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

0

Bir TextView üzerinde Metin kopyalamak için tıklayın eklemek için Kotlin yardımcı yöntemi

Bu yöntemi Util sınıfında bir yere koyun. Bu yöntem, metnin İçeriğini Kopyalamak için metin görünümünde tıklama dinleyicisini ekler

/**
 * 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()
        }
    }

}

0

Bu düğme panoya kopyala işlevini onclick button olayı sırasında gerçekleştirebilirsiniz. bu yüzden bu kod satırlarını düğmenizin içine yerleştirin

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

0

Bu kodu yazmanız yeterlidir:

clipboard.setText(getstring);

Başlatmayı unuttun clipboard. Ama için teşekkürler setText. Kullanımdan kaldırıldı, bu yüzden kullanın val clip = ClipData.newPlainText(null, text) clipboard.setPrimaryClip(clip).
CoolMind

-1

Kotlin için

 ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);
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.