Làm cách nào để sao chép văn bản vào Clip Board trong Android?


313

Ai đó có thể vui lòng cho tôi biết làm thế nào để sao chép văn bản hiện diện trong một chế độ xem văn bản cụ thể vào bảng tạm khi nhấn nút không?

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

            }
        });
    }

}

Tôi muốn sao chép Text in TextView textView sang clipboard khi bCopynhấn nút.



stackoverflow.com/q/48791271/9274175 Vui lòng trả lời câu hỏi này trên coppy
Yash Kale

Câu trả lời:


590

sử dụng ClipboardManager

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

hãy chắc chắn rằng bạn đã nhập android.content.ClipboardManagervà KHÔNG android.text.ClipboardManager. Latter bị phản đối. Kiểm tra liên kết này để biết thêm thông tin.


3
Cái này chỉ dành cho API11 + không hoạt động cho GB trở xuống
Javier

48
"Nhãn" được sử dụng để làm gì?
nhà phát triển Android

19
@androiddeveloper Giải thích về tham số "nhãn": stackoverflow.com/questions/33207809/iêu
smg

3
@smg Vì vậy, nó là nhiều hơn cho các nhà phát triển? Nhưng làm thế nào mà nó nói nó được hiển thị cho người dùng?
nhà phát triển Android

7
Trong androidx, nó thực sự trở thànhClipboardManager clipboard = getSystemService(getContext(), ClipboardManager.class);
HoratioCain

72

Đây là phương pháp để sao chép văn bản vào 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);
  }
}

Phương pháp này đang hoạt động trên tất cả các thiết bị Android.


2
Tôi không hiểu ý nghĩa của "bối cảnh". Bạn có thể thêm một ví dụ về cách gọi đúng phương thức đó không? Cảm ơn.
E_Blue

1
Ngoài ra, có vẻ như giá trị của "bối cảnh" không được sử dụng. Vậy tại sao nó phải được thông qua như là tham số?
E_Blue

này anh bạn, bối cảnh được yêu cầu trong đoạn để gọi getSystemService
vuhung3990

@E_Blue bối cảnh.getSystemService (Context.CLIPBOARD_SERVICE) ??? có thật không???
androidStud

1
@E_Blue có vẻ như bạn là một nhà phát triển Android ngây thơ, người hỏi về bối cảnh. Vâng, đó cũng không phải là một vấn đề, nhưng chỉ cần quan tâm đến giọng điệu của bạn và làm một số nghiên cứu / nghiên cứu về mọi thứ quá.
androidStud

57

Hôm qua tôi đã làm lớp này. Mang nó, nó cho tất cả các cấp 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 "";
    }

}

Bạn có thể thêm các báo cáo nhập khẩu cần thiết để làm cho lớp này hoạt động?
merlin2011

@ merlin2011 đã làm điều đó, nghĩ rằng tôi đã quên phương thức coerceToText (...). Sry cho điều đó
NHƯ

"CoerceToText" làm gì? Ngoài ra, có thể sao chép / dán các loại dữ liệu khác vào bảng tạm (ví dụ: bitmap) không?
nhà phát triển Android

1
@AS tại sao bạn viết phương pháp corceToText cho mình? ! nó đã có sẵn với api, xem developer.android.com/reference/android/content/,
Hardik

Nhưng tôi nghĩ đã đến lúc các nhà phát triển ngừng hỗ trợ công cụ trước về API17. Không còn nhiều đơn vị loại cũ và họ không có xu hướng tải xuống ứng dụng mới? Chẳng hạn, tôi sử dụng các đơn vị cao tuổi để điều hướng trong chiếc thuyền buồm của mình và mọi thứ khác đều bị xóa sạch. Tôi không ngại ném nhầm các đơn vị như vậy lên tàu?
Jan Bergström

23

Là một phần mở rộng kotlin tiện dụng:

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

Cập nhật:

Nếu bạn sử dụng ContextCompat, bạn nên sử dụng:

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

1
API hiện đã thay đổi thành clipboardManager = getSystemService (bối cảnh, ClipboardManager :: class.java)
Per Christian Henden

Nó thực sự đã thay đổi thành context.getSystemService(ClipboardManager::class.java)bạn đang trỏ đến một chữ ký ContextCompat phải không? Cảm ơn vì bạn đã phản hồi
crgarridos

13

Chỉ cần sử dụng này. Nó chỉ hoạt động cho android api> = 11 trước đó mà bạn sẽ phải sử dụng ClipData.

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

Hy vọng nó sẽ giúp bạn :)

[CẬP NHẬT 3/19/2015] Giống như Ujjwal Singh nói rằng phương pháp setTextnày không được dùng nữa, bạn nên sử dụng, giống như các tài liệu giới thiệu nó, setPrimaryClip (clipData)


1
Đó là tên của biến của tôi. Nếu bạn đang sử dụng Hoạt động của mình, chỉ cần sử dụng (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE); _clipboard.setText(YOUR TEXT);
Ektos974

1
Không dùng nữa - không sử dụng sử setTextdụng ClipData+setPrimaryClip
Ujjwal Singh

1
Đối với tôi, nó cũng hiển thị lỗi khi sử dụng setPrimaryClip
Praneeth

11

Điều này có thể được thực hiện trong Kotlin như thế này:

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

file.readText()Chuỗi đầu vào của bạn ở đâu


7

sử dụng mã này

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

Cảm ơn rất nhiều, nó rất dễ sử dụng.
iamkdblue

7

sử dụng chức năng này để sao chép vào clipboard

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

sử dụng phương pháp này:

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

tại vị trí của setPrimaryClip, chúng ta cũng có thể sử dụng các phương thức sau:

void    clearPrimaryClip()

Xóa bất kỳ clip chính hiện tại trên clipboard.

ClipData    getPrimaryClip()

Trả về clip chính hiện tại trên clipboard.

ClipDescription getPrimaryClipDescription()

Trả về một mô tả của clip chính hiện tại trên bảng tạm nhưng không phải là bản sao dữ liệu của nó.

CharSequence    getText()

Phương pháp này không được chấp nhận. Sử dụng getPrimaryClip () thay thế. Điều này lấy clip chính và cố gắng ép nó thành một chuỗi.

boolean hasPrimaryClip()

Trả về true nếu hiện tại có một clip chính trên clipboard.


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

Hãy thử đoạn mã sau. Nó sẽ hỗ trợ API mới nhất:

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

Phương pháp trợ giúp của Kotlin để đính kèm nhấp để sao chép Văn bản trên TextView

Đặt phương thức này ở đâu đó trong lớp Util. Phương pháp này đính kèm trình nghe nhấp vào textview để Sao chép Nội dung của textView sang một clipText khi nhấp vào textView đó

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

Bạn có thể thực hiện chức năng sao chép này vào chức năng clipboard khi sự kiện nút onclick. vì vậy hãy đặt các dòng mã này bên trong nút của bạn trênClickListerner

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

Chỉ cần viết mã này:

clipboard.setText(getstring);

Bạn quên khởi tạo clipboard. Nhưng cảm ơn vì setText. Nó không được dùng nữa, nên sử dụng val clip = ClipData.newPlainText(null, text) clipboard.setPrimaryClip(clip).
CoolMind

-1

Đối với Kotlin

 ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.