2010-04-13 39 views
38

Ban đầu tôi muốn một dấu kiểm nơi văn bản được đặt ở bên trái dấu kiểm. Sau khi tìm kiếm trên trang web này tôi phát hiện ra cách giải quyết tốt nhất là android: CheckedTextView? Tuy nhiên, tôi phát hiện ra rằng không thể thay đổi dấu kiểm theo cách thủ công bởi người dùng. Có phải do thiết kế?android: CheckedTextView không thể kiểm tra được?

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/autoupdatecheckboxview" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:gravity="center_vertical" 
android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
android:paddingLeft="6dip" 
android:paddingRight="6dip" 
android:text="Pop up a message when new data available" 
android:typeface="sans" android:textSize="16dip"/> 
+0

Sau đó, CheckedTextView phải được đặt tên là ListCheckedTextView? goddamn google –

Trả lời

29

Bạn có thể muốn chỉ cần sử dụng thường xuyên CheckBox (mà thừa hưởng từ Button và do đó TextView). CheckedTextView được thiết kế để hoạt động với chế độ xem danh sách. Ví dụ CheckBox bố cục XML dưới đây:

<CheckBox 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Pop up a message when new data available" 
    android:textSize="16dip" /> 
119

Có thể, và hơi đơn giản để thực hiện những gì bạn đang tìm kiếm. Có, CheckedTextView được sử dụng chủ yếu để có một chế độ xem Checkable duy nhất trong hàng của một ListView, kiểm soát các trạng thái có thể kiểm tra của trẻ bằng cách sử dụng choiceMode. Tuy nhiên, vì hộp kiểm không xuất hiện để hỗ trợ hộp kiểm căn phải, và hộp kiểm tra CheckedTextView , nên bạn nên sử dụng những gì ở đó.

Vì ListView kiểm soát trạng thái đã chọn của mục danh sách, chính bản thân CheckedTextView không phản hồi sự kiện nhấp chuột và không thể nhấp hoặc có thể lấy tiêu điểm theo mặc định. Tuy nhiên, nó đáp ứng với các trạng thái nhấn và tập trung - điều đó có nghĩa là nó có thể nhận được sự kiện tập trung và nhấp chuột, và trông chính xác như một hộp kiểm nên xem xét. Điều duy nhất còn thiếu là nó không chuyển trạng thái được kiểm tra của nó khi nhấp chuột. Do đó, một OnClickListener nhanh chóng gọi .toggle() sẽ cung cấp cho bạn kết quả cuối cùng mà bạn đang tìm kiếm.

Tóm lại, bạn cần 3 điều: nhấp được, đặt tiêu điểm, và OnClickListener:

CheckedTextView chkBox = (CheckedTextView) findViewById(R.id.CheckedTextView01); 
    chkBox.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) 
     { 
      ((CheckedTextView) v).toggle(); 
     } 
    }); 

và file layout:

<CheckedTextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/CheckedTextView01" 
    android:checked="true" 
    android:clickable="true" 
    android:focusable="true" 
    android:text="Label on Left Side of Checkbox." 
    /> 
+0

Cảm ơn bạn đã giải thích: không rõ ràng, tại sao loại điều khiển này có thể không nhấp được theo mặc định. – Smileek

+4

Câu trả lời hay. Để làm cho CheckedTextView hoạt động giống với một mục danh sách, bạn nên đặt nền cho ? Android: attr/listChoiceBackgroundIndicator. – Moritz

+0

_ + 1_ cho điều này cũng http://stackoverflow.com/questions/12641529/unable-to-check-uncheck-checkedtextview-inside-getview – nAkhmedov

0

Nếu bạn muốn kiểm soát nhiều hạt mịn trên nhãn và hộp kiểm, một lựa chọn khác là sử dụng RelativeLayout và thuộc tính android: layout_alignParentRight:

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <TextView 
     android:id="@+id/my_checkbox_label" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="my checkbox label" /> 
    <CheckBox 
     android:id="@+id/my_checkbox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" /> 
</RelativeLayout> 

bạn có thể điều chỉnh lề/etc của textview và checkbox cho phù hợp với nhu cầu của bạn.

9

Bạn có thể sử dụng và chuyển đổi CheckedTextView bằng cách sau:

Trong bố cục:

<CheckedTextView 
     android:id="@+id/cv_id" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Some text here" 
     android:textSize="18sp" 
     android:gravity="center_vertical" 
     android:clickable="true" 
     android:checkMark="@drawable/btn_check_off" 
     android:focusable="true" 
     android:checked="false" 
     android:onClick="toggle"/> 

Trong hoạt động của bạn:

public void toggle(View v) 
{ 
    CheckedTextView cView = (CheckedTextView) v.findViewById(R.id.cv_file_name); 
     if (cView.isSelected()) 
     { 
      cView.setSelected(false); 
      cView.setCheckMarkDrawable (R.drawable.btn_check_off); 
     } 
     else 
     { 
      cView.setSelected(true); 
      cView.setCheckMarkDrawable (R.drawable.btn_check_on); 
     } 
} 

Và đừng quên đặt drawables. Tôi nhận được nó từ SDK ... \ android-sdk-windows \ nền tảng \ android-10 \ data \ res \ drawable-mdpi \

+0

Cảm ơn, điều này làm việc tuyệt vời cho tôi. – Jeff

1

bố trí này trông và hoạt động theo cùng một cách như CheckedTextView:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/dropdownListPreferredItemHeight" 
    android:gravity="center_vertical" > 

    <TextView 
     android:id="@android:id/text1" 
     style="?android:attr/spinnerDropDownItemStyle" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:ellipsize="marquee" 
     android:singleLine="true" /> 

    <CheckBox 
     android:id="@android:id/checkbox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:clickable="false" 
     android:duplicateParentState="true" 
     android:focusable="false" /> 

</LinearLayout> 

Chỉ có thêm legwork là đặt OnClickListener trên chế độ xem gốc và gọi checkBox.toggle() trên CheckBox.

1

Dưới đây là sử dụng của tôi trong SingleChoiceDialog

1.select_dialog_singlechoice.xml

<?xml version="1.0" encoding="UTF-8"?> 
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    style="@style/PopupSelectList" 
    android:checkMark="@drawable/radio" 
    android:ellipsize="marquee" 
    android:gravity="center_vertical" 
    android:paddingLeft="12.0dip" 
    android:paddingRight="10.0dip" /> 

2.style.xml

<style name="PopupSelectList"> 
    <item name="android:textSize">16.0sp</item> 
    <item name="android:textColor">@color/white</item> 
    <item name="android:background">@drawable/list_item_selector</item> 
    <item name="android:layout_width">fill_parent</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:minHeight">@dimen/dialog_select_height</item> 
</style> 

3.ratio.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/dot_selected" android:state_checked="true" android:state_window_focused="false"/> 
    <item android:drawable="@drawable/dot_normal" android:state_checked="false" android:state_window_focused="false"/> 
    <item android:drawable="@drawable/dot_normal" android:state_checked="false"/> 
    <item android:drawable="@drawable/dot_selected" android:state_checked="true"/> 
</selector> 

4. trong bộ chuyển đổi của g etView

CheckedTextView title = (CheckedTextView) convertView 
       .findViewById(android.R.id.text1); 
     title.setText(mItems[position]); 
     title.setSelected(mCheckedItem == position ? true : false); 
        title.setCheckMarkDrawable(position == mCheckedItem ?     R.drawable.dot_selected 
       : R.drawable.dot_normal); 
+0

nơi biến mCheckedItem không có trong ArrayAdapter của tôi. – JPM

+0

Bạn có thể đặt CheckedTextView ở bất cứ đâu bạn muốn. – Geek4IT

1

câu trả lời đơn giản được sử dụng: isChecked() phương pháp thay vì isSelected().

CheckedTextView chkBox = (CheckedTextView) findViewById(R.id.CheckedTextView01); 
chkBox.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) 
    { 
     if(((CheckedTextView) v).isChecked()){ 
      ((CheckedTextView) v).setChecked(false); 
     }else{ 
      ((CheckedTextView) v).setChecked(true);    
     } 
    } 
}); 

và nhận trạng thái sử dụng phương thức view.isChecked().

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