Làm cách nào để kích hoạt tính năng dán bản sao chuẩn cho TextView trong Android?


119

Tôi muốn bật dán bản sao tiêu chuẩn cho TextView (giống như cho EditText). Tôi làm nó như thế nào?

Tôi đã thử sử dụng EditText không thể chỉnh sửa nhưng nó không hoạt động tốt (đôi khi nó có thể chỉnh sửa được hoặc lớp phủ dán sao chép không được hiển thị). Và nó có lẽ không phải là một cách tiếp cận tốt nói chung.

Cần một giải pháp hoạt động bắt đầu từ API 7.


này những gì bạn đang tìm kiếm?
Jermin Bazazian

Nó tương tự, nhưng không giống nhau vì tôi muốn sao chép tất cả văn bản. Nhưng nó trông giống nhau. Vấn đề là câu trả lời chỉ có công trình bắt đầu từ API 11 và tôi cần một cái gì đó mà làm việc từ API 7.
Ixx

ClipboardManagercó sẵn kể từ API 1 (xem tại đây ). Làm thế nào về nhấn và giữ, với một cửa sổ bật lên để sao chép vào khay nhớ tạm?
Jermin Bazazian

@Jermin Có, có vẻ như tôi phải thực hiện một giải pháp tùy chỉnh.
Ixx

Câu trả lời:


226

Cố gắng android:textIsSelectable.

I E, android:textIsSelectable="true"


Người ta có thể làm điều đó cho EditTextPreference?
powder366,

1
@ powder366: Tôi nghĩ rằng nó EditTextPreferenceđã hỗ trợ sao chép / dán. Nó chắc chắn có trong ứng dụng Cài đặt.
CommonsWare

Trên thực tế nó có vẻ là một lỗi. Hiển thị trên thiết bị Samsung 4.2.2 của tôi. Nexus7 và Nexus10 hoạt động. code.google.com/p/android/issues/detail?id=26008
powder366 Ngày

Chỉ cần lưu ý về điều này, nếu chế độ xem văn bản của bạn ban đầu bị ẩn và bạn đang hiển thị nó theo chương trình bằng setVisibility, thì bạn cần sử dụng textView.setTextIsSelectable (true) để thực hiện việc này. Nó sẽ không hoạt động qua xml trong trường hợp đó.
Praveen Singh

58

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

  1. Thay đổi trong 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"

  2. Trong lớp Java của bạn, hãy viết dòng này để thiết lập nó theo chương trình. myTextView.setTextIsSelectable(true);

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


1
tôi làm như vậy. khi tôi nhấp vào văn bản, thanh công cụ có các nút "sao chép" và "chọn al" mở ra. nhưng sau khi tôi nhấp vào chúng không có gì xảy ra. tôi có thể làm gì?
Mina Dahesh

2
Giải pháp này tốt hơn giải pháp được đánh dấu đúng bằng dấu kiểm màu xanh lá cây.
Adam Hurwitz,

21

Điều này hoạt động cho sao chép trước Honeycomb:

import android.text.ClipboardManager;

textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        ClipboardManager cm = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
        cm.setText(textView.getText());
        Toast.makeText(context, "Copied to clipboard", Toast.LENGTH_SHORT).show();
    }
});

4
Một chiến lược tốt sẽ là sử dụng điều này cùng với câu trả lời của CommonsWare. Vì thêm các android:textIsSelectablecuộc sống trong bố cục, nó sẽ chỉ bị bỏ qua ở các cấp API thấp hơn. Sau đó, sử dụng giải pháp của Ixx trong câu lệnh if để kiểm tra xem cấp API có dưới 11. Tốt nhất của cả hai thế giới. Điều thú vị android:textIsSelectablelà nó cung cấp cho bạn thanh hành động lựa chọn văn bản của nền tảng và có cảm giác gốc đẹp.
emil10001 11/09/12

1
Phương pháp setText (CharSequence) từ loại ClipboardManager bị phản đối
S.M_Emamian

1
Vâng, câu trả lời này là từ hơn 2 năm trước. Hãy chỉnh sửa hoặc thêm một cái mới.
Ixx

11

Yêu cầu API 11 , Mã cập nhật, phương pháp trước đó không được dùng nữa

Giải pháp cho chủ đề toàn màn hình mà không có ActionBar

Mở rộng TextViewvà trong hàm tạo, dán mã sau

this.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                ClipboardManager cManager = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData cData = ClipData.newPlainText("text", getText());
                cManager.setPrimaryClip(cData);
                Util.toast(mContext, string.text_copyed);
                return true;
            }
        });

9

Trong textview xml, hãy dán mã này

android:textIsSelectable="true"

Sau đó, trong tệp java,

 final TextView txtcopypaste = findViewById(R.id.txtcopypaste); // my textview
    txtcopypaste.setOnClickListener(new View.OnClickListener() { // set onclick listener to my textview
        @Override
        public void onClick(View view) {
            ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE);
            cm.setText(txtcopypaste.getText().toString());              
            Toast.makeText(getApplicationContext(), "Copied :)", Toast.LENGTH_SHORT).show();
        }
    });

Yêu cầu: Cần sao chép và dán văn bản trong textview.

OutCome: Sử dụng textview, sau khi tôi nhấp vào textview. Nó đã tự động sao chép văn bản trong chế độ xem văn bản.

Ghi chú: Trong khi nhập trình quản lý clipboard, hãy cố gắng thích

Vui lòng thích trình quản lý khay nhớ tạm

import android.text.ClipboardManager; // prefer this 

cố gắng tránh trình quản lý khay nhớ tạm nội dung

import android.content.ClipboardManager; // Not this

3
  1. sử dụng chủ đề

    @android:style/Theme.Black.NoTitleBar.Fullscreen

    hoặc là

    @android:style/Theme.WithActionBar
  2. đặt TextView trong xml

    android:textIsSelectable="true"
  3. xem kết quả


3

nếu ai đó muốn đi xa hơn và thực hiện việc chọn và sao chép vào khay nhớ tạm bằng một cú nhấp chuột:

 phone.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                            ClipData clip = ClipData.newPlainText("PhoneNumber", phone.getText());
                            clipboard.setPrimaryClip(clip);

                        }
                    });

phone là TextView và phone.Text là Text sẽ được sao chép vào khay nhớ tạm.


0

cái này tốt hơn:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
final android.content.ClipboardManager clipboardManager = (android.content.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
final android.content.ClipData clipData = android.content.ClipData
        .newPlainText("text label", "text to clip");
clipboardManager.setPrimaryClip(clipData);
} else {
final android.text.ClipboardManager clipboardManager = (android.text.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setText("text to clip");
}

-2

Đối với một EditText, trong tệp kê khai bên trong hoạt động sử dụng android:windowSoftInputMode="adjustResize"

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.