2010-06-01 40 views
14

Tôi có một ListView trong đó mỗi mục là TextView.Sao chép văn bản từ TextView trên Android

Tôi muốn kích hoạt các hành vi báo chí dài tương tự như một EditText hiển thị menu ngữ cảnh mặc định với các mục như "Chọn tất cả", "Cắt tất cả", "Sao chép tất cả", vv

Có một cách dễ dàng cách để kích hoạt tính năng này cho một TextView?

+0

tại thời điểm tôi đăng ký trình đơn ngữ cảnh và sử dụng trình quản lý clipboard để sao chép toàn bộ văn bản của TextView. Nhưng có vẻ như có một cách mặc định để làm điều này. – Erdal

+0

Thực ra, menu ngữ cảnh được điều chỉnh cho phù hợp. Bạn có thể tùy chỉnh nó khi rảnh rỗi. Bạn cũng có thể xem lớp AlertDialog. Nó không thường được sử dụng cho mục đích này, nhưng bạn có thể gọi nó với một cú nhấp chuột dài. Tuy nhiên, nếu tôi nhớ rõ, bạn có giới hạn tối đa 3 nút. – Sephy

+0

Một điều nữa, tôi không biết nếu nó được khuyến khích để làm điều đó, nhưng bạn có thể thử để đưa listview của bạn trong một framelayout và thêm một cái nhìn/bố trí bên trong nhưng với một tầm nhìn đi, và biến tầm nhìn của nó để nhìn thấy khi một yếu tố danh sách của bạn được nhấp và cập nhật nội dung của danh sách đó? – Sephy

Trả lời

20

Tôi nghĩ mình có giải pháp. Chỉ cần gọi
registerForContextMenu(yourTextView);

TextView của bạn sẽ được đăng ký để nhận các sự kiện menu ngữ cảnh.

Sau đó ghi đè onCreateContextMenu trong Activity của bạn:

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    //user has long pressed your TextView 
    menu.add(0, v.getId(), 0, "text that you want to show in the context menu - I use simply Copy"); 

    //cast the received View to TextView so that you can get its text 
    TextView yourTextView = (TextView) v; 

    //place your TextView's text in clipboard 
    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
    clipboard.setText(yourTextView.getText()); 
} 

Hy vọng điều này sẽ giúp bạn và bất kỳ ai tìm kiếm một cách để sao chép văn bản từ một TextView

+0

Cảm ơn bài đăng, chỉ cần những gì tôi cần cho API cấp 2.1. Lúc đầu nó không hoạt động, phát hiện ra tôi đã phải loại bỏ này từ manifest xml: android: configChanges = "keyboardHidden" – Alan

+4

Nó hoạt động. Mặc dù nó sao chép văn bản trước khi người dùng thực sự nhấp vào bản sao. Điều đó có thể gây nhầm lẫn và ghi đè lên clipboard của họ.Một cách khác là thực hiện sao chép trong onContextItemSelected. Bạn đã đặt id tùy chọn trình đơn thành id chế độ xem nhưng không sử dụng nó. Ngoài ra, hãy đảm bảo bạn nhập android.text.ClipboardManager thay vì android.content.ClipboardManager cho ví dụ này nếu bạn đang nhắm mục tiêu các thiết bị

+0

Làm cách nào để sao chép chỉ khi mục menu được nhấp? –

1

Bạn có thể muốn đăng ký một onItemLongClickListener trên ListView của bạn và sau đó dựa trên mục đã chọn, cung cấp cho người dùng bất kỳ tùy chọn nào bạn chọn.

7

Thực ra, bạn không phải tự mình phát triển tính năng này. Bạn chỉ cần sử dụng EditText thay vì TextView, trong khi bạn thiết lập android: editable của EditText thành false. Mã của tôi là ở đây:

R.layout.edittext.xml

<EditText xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="40dip" 
android:editable="false" 
android:background="@null" 
android:textColor="#FFFFFF"/> 

ListItemCopyTextActivity.java

public class ListItemCopyTextActivity extends Activity {  

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    LinearLayout ll = new LinearLayout(this); 
    ListView lv = new ListView(this); 

    String[] values = new String[15]; 
    for (int i = 0; i < 15; i++) { 
     values[i] = "ListItem NO." + i; 
    } 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      R.layout.edittext, values); 
    lv.setAdapter(adapter); 

    ll.addView(lv, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 

    setContentView(ll); 

    } 
} 

Bạn có thể chỉ dài vào mục, và chọn văn bản lựa chọn, sao chép, cắt , quá khứ, v.v.

+2

Không hiệu quả với tôi. Nếu có thể chỉnh sửa là sai, tôi nhận được "TextView không hỗ trợ lựa chọn văn bản. Đã hủy chế độ hành động". Sử dụng android: textIsSelectable là một giải pháp tốt cho tôi. –

3

Để cho phép người dùng sao chép một số hoặc tất cả giá trị của TextView và dán vào một nơi khác,

đặt thuộc tính XML {@link android.R.styleable#TextView_textIsSelectable android:textIsSelectable}-"true"

hoặc

gọi {@link #setTextIsSelectable setTextIsSelectable(true)}.

Các vấn đề liên quan