2010-04-13 5 views
38

Первоначально мне нужна отметка, в которой текст помещается слева от галочки. После поиска на этом сайте я обнаружил, что лучшим решением является android: CheckedTextView? Однако я обнаружил, что галочку нельзя изменить вручную пользователями. Это по дизайну?android: CheckedTextView не может быть проверен?

<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

Затем CheckedTextView должен был называться ListCheckedTextView? goddamn google –

ответ

29

Вы, вероятно, хотите, чтобы просто использовать обычный CheckBox (который наследуется от Button и, таким образом, TextView). CheckedTextView предназначен для работы со списками. Пример CheckBox макет XML ниже:

<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

Это возможно, и несколько просто реализовать то, что вы ищете. Да, CheckedTextView используется, в основном, для одного вида Checkable в строке ListView, который контролирует контролируемые состояния своих детей, используя choiceMode. Тем не менее, поскольку CheckBox не поддерживает флажок с выравниванием по правому краю, и CheckedTextView имеет с выравниванием по правому краю, имеет смысл хотеть использовать то, что там.

Поскольку ListView управляет проверенным состоянием элемента списка, сам CheckedTextView не отвечает на события кликов, и по умолчанию он не доступен для клика или фокуса. Тем не менее, он реагирует на нажатые и сфокусированные состояния - это означает, что он может получать фокус и щелчки, и выглядит корректно, если флажок должен выглядеть. Единственное, чего не хватает, это то, что он не переключает свое проверенное состояние при нажатии. Поэтому быстрый OnClickListener, который вызывает .toggle(), даст вам конечный результат, который вы ищете.

В общем, вам нужно 3 вещи: интерактивными, фокусирования и onClickListener:

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

и расположение файла:

<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

Спасибо за объяснение: не было очевидно, почему этот вид элементов управления по умолчанию может быть неаккумулируемым. – Smileek

+4

Отличный ответ. Чтобы сделать CheckedTextView более похожим на элемент списка, вы должны установить фон ? Android: attr/listChoiceBackgroundIndicator. – Moritz

+0

_ + 1_ для этого также http://stackoverflow.com/questions/12641529/unable-to-check-uncheck-checkedtextview-inside-getview – nAkhmedov

0

Если вы хотите более точный контроль над этикеткой и checkbox, другой альтернативой является использование RelativeLayout и атрибута 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> 

, вы можете настроить поле/etc текста и флажок в соответствии с вашими потребностями.

9

Вы можете использовать и переключать CheckedTextView следующим образом:

В макете:

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

В вашей деятельности:

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

И не забудьте поставить вводимого коэффициента. Я получаю его из SDK ... \ андроид-СДК-окна \ платформы \ андроид-10 \ Data \ рес \ Drawable-MDPI \

+0

Спасибо, это отлично поработало для меня. – Jeff

1

Этот макет выглядит и ведет себя так же, как 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> 

Только дополнительная работа заключается в том, чтобы установить OnClickListener в корневом режиме и позвонить checkBox.toggle() на CheckBox.

1

Вот мое использование в 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. В адаптере 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

где переменная mCheckedItem нет в моем ArrayAdapter. – JPM

+0

Вы можете поместить свой CheckedTextView в любом месте. – Geek4IT

1

простой ответ использование: isChecked() метод вместо 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);    
     } 
    } 
}); 

и получите статус используя метод view.isChecked().