Làm cách nào để sao chép văn bản theo chương trình trong ứng dụng Android của tôi?


231

Tôi đang xây dựng một ứng dụng Android và tôi muốn sao chép giá trị văn bản của tiện ích EditText. Người dùng có thể nhấn Menu+Asau đó Menu+Cđể sao chép giá trị, nhưng tôi sẽ làm điều này bằng cách lập trình như thế nào?



Về cơ bản, đây là một câu hỏi trùng lặp của: stackoverflow.com/a/13517876/2116185
user2116185

Câu trả lời:


419

Sử dụng ClipboardManager#setPrimaryClipphương pháp:

import android.content.ClipboardManager;

// ...

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

ClipboardManager Tham chiếu API


7
Sử dụngimport android.content.ClipboardManager;
MatheusJardimB

Chức năng này có hoạt động trên API 11+ (bao gồm cả kẹo mút) hay không?
Ashraf Alshahawy

22
label
Alaa M.

2
bạn cũng có thể thêm thông báo thành công sau khi sao chép để thông báo cho người dùng rằng văn bản được sao chépContext context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Shady Sherif

1
@AlaaM. Tôi nghĩ khay clip này là tùy chọn của LG và bạn không thể kiểm soát nó
Shady Sherif

217

Vì vậy, mọi người đều đồng ý về cách thực hiện việc này, nhưng vì không ai muốn đưa ra một giải pháp hoàn chỉnh, nên đây:

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

Tôi giả sử bạn có một cái gì đó như sau được khai báo trong bảng kê khai:

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

Nó không hoạt động, vì trình biên dịch đưa ra lỗi: Cuộc gọi yêu cầu API cấp 11 (tối thiểu hiện tại là 7): android.content.ClipboardManager # setPrimaryClip dòng 245 Vấn đề về Android Lint.
JavaRunner

2
Bạn đã thêm mục tiêu và tối thiểu sdk vào bảng kê khai của bạn? Nếu có, vô hiệu hóa cảnh báo lint.
Warpzit

4
Thêm 3 dòng sau vào phương thức của bạn @SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("deprecation"), @TargetApi (11) ........ Đó là những gì tôi đã làm, và nó hoạt động.
RRTW

2
Bất cứ ai có thể xin vui lòng cho tôi biết chính xác việc sử dụng labeltrong newPlainTextphương pháp là gì? các tài liệu tuyên bố label User-visible label for the clip data.. Nhưng khi nào labelngười dùng có thể nhìn thấy? Và loại giá trị / tên nào tôi nên đặt vào label?
shadyinside

@tannerjohn Tôi đoán rằng đó là một loại xem trước được sử dụng ở đâu đó. Nhưng tôi không biết ở đâu. Nhưng bạn chỉ có thể sử dụng cùng một văn bản hai lần ...
Warpzit

15

Googling đưa bạn đến android.content.ClipboardManager và bạn có thể quyết định, như tôi đã làm, Clipboard đó không có sẵn trên API <11, vì trang tài liệu có nội dung "Kể từ: API cấp 11".

Thực tế, có hai lớp, lớp thứ hai mở rộng lớp thứ nhất - android.text.ClipboardManager và android.content.ClipboardManager.

android.text.ClipboardManager hiện có từ API 1, nhưng nó chỉ hoạt động với nội dung văn bản.

android.content.ClipboardManager là cách ưa thích để làm việc với clipboard, nhưng nó không khả dụng trên Cấp độ API <11 (Honeycomb).

Để có được bất kỳ trong số họ, bạn cần mã sau đây:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Nhưng đối với API <11, bạn phải nhập android.text.ClipboardManagervà cho API> = 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());
}

bạn có thể thử điều này ..


8

Dưới đây là một số mã để thực hiện một số chức năng sao chép và dán từ EditText (nhờ Warpzit để kiểm tra phiên bản). Bạn có thể kết nối chúng với sự kiện onclick của nút.

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

Bạn không thể gọi các phương thức sao chép / dán / cắt của Android mà không cần viết chúng như bạn đang làm? Tôi đã tạo một thanh công cụ chọn văn bản tùy chỉnh với chức năng để người dùng có thể tạo một văn bản được chọn in đậm / in nghiêng / gạch chân, v.v. nhưng sau khi tùy chỉnh, các chức năng mặc định sao chép / dán / cắt không hoạt động nữa, nhưng các biểu tượng cho chúng vẫn xuất hiện?

"WordKeeper" để làm gì?
nhà phát triển Android

7

Cập nhật thư viện hỗ trợ Android

Kể từ Android Oreo, thư viện hỗ trợ chỉ chuyển xuống API 14. Hầu hết các ứng dụng mới hơn có thể có API tối thiểu là 14 và do đó không cần phải lo lắng về các vấn đề với API 11 được đề cập trong một số câu trả lời khác. Rất nhiều mã có thể được làm sạch. (Nhưng hãy xem lịch sử chỉnh sửa của tôi nếu bạn vẫn hỗ trợ các phiên bản thấp hơn.)

Sao chép

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

Dán

Tôi đang thêm mã này dưới dạng phần thưởng, vì sao chép / dán thường được thực hiện theo cặp.

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

Ghi chú

  • Hãy chắc chắn để nhập android.content.ClipboardManager phiên bản chứ không phải cũ android.text.ClipboardManager. Giống vớiClipData .
  • Nếu bạn không tham gia hoạt động, bạn có thể nhận dịch vụ với context.getSystemService() .
  • Tôi đã sử dụng khối try / Catch để lấy văn bản dán vì có thể có nhiều thứ null. Bạn có thể kiểm tra từng cái nếu bạn thấy cách đó dễ đọc hơn.

1
"Nhãn văn bản" để làm gì?
nhà phát triển Android

@androiddeveloper, tôi chưa bao giờ thực sự sử dụng nhãn cho bất cứ điều gì, nhưng hãy xem phần Hỏi & Đáp này .
Suragch

Vì vậy, mặc dù nó nói rằng nó hiển thị cho người dùng, nhưng thực tế thì không, và phụ thuộc vào các nhà phát triển sử dụng nó nếu cần.
nhà phát triển Android

5

Để bật sao chép / dán tiêu chuẩn cho TextView, U có thể chọn một trong các tùy chọn sau:

Thay đổi tệp bố cục: thêm thuộc tính bên dưới vào TextView của bạn

android:textIsSelectable="true"

Trong lớp Java của bạn, viết dòng này, hai tập hợp ngữ pháp.

myTextView.setTextIsSelectable(true);

Và nhấn và giữ trên TextView, bạn có thể thấy thanh hành động sao chép / dán.


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

Và nhập khẩu import android.content.ClipboardManager;


3

@FlySwat đã đưa ra câu trả lời đúng, tôi chỉ chia sẻ câu trả lời đầy đủ:

Sử dụng phương thức 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); 

Đâu label là nhãn người dùng có thể nhìn thấy cho dữ liệu clip và textlà văn bản thực tế trong clip. Theo tài liệu chính thức .

Điều quan trọng là sử dụng nhập khẩu này:

import android.content.ClipboardManager;

Tại sao bạn sao chép \ dán câu trả lời? Nhãn là gì?
AlexS

@AlexS như tôi đã nói, một người bạn khác đã trả lời đúng, tôi chỉ đăng một cách khác với nhiều chi tiết hơn, tôi nghĩ nó sẽ hữu ích cho ai đó
Trinity

1

Đây là mã làm việc của tôi

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

    }
}

Khi yu chia sẻ một mã, hãy cố gắng giải thích nó. Bạn có thể truy cập và kiểm tra làm thế nào để trả lời một câu hỏi .
Yunus Temurlenk

@YunusTemurlenk Cảm ơn lời đề nghị của bạn, lần tới tôi sẽ chỉnh sửa câu trả lời của mình bằng một mô tả
Mehul Boghra

1

Đối với Kotlin, chúng ta có thể sử dụng phương pháp sau. Bạn có thể dán phương pháp này bên trong một hoạt động hoặc đoạn.

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

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

}

Cảm ơn bạn! Phần context.tôi bị thiếu - có thể là do tôi đang thực hiện nó trong một đoạn.
Cullub
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.