2010-04-13 5 views
38

Inizialmente volevo un segno di spunta in cui il testo è posizionato a sinistra del segno di spunta. Dopo aver cercato su questo sito ho scoperto che la soluzione migliore è Android: CheckedTextView? Tuttavia, ho scoperto che il segno di spunta non può essere modificato manualmente dagli utenti. È di progettazione?android: CheckedTextView non può essere controllato?

<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

Quindi CheckedTextView dovrebbe essere denominato ListCheckedTextView? dannazione google –

risposta

29

probabilmente si desidera utilizzare solo un normale CheckBox (che eredita da Button e quindi TextView). CheckedTextView è progettato per funzionare con le visualizzazioni elenco. Esempio CheckBox file XML di layout è qui sotto:

<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

E 'possibile, e un po' semplice da implementare ciò che si sta cercando. Sì, CheckedTextView viene utilizzato principalmente per avere una singola vista Checkable nella riga di ListView, che controlla gli stati controllabili dei propri figli utilizzando choiceMode. Tuttavia, dal momento che CheckBox non sembra supportare una casella di controllo allineata a destra da sola e CheckedTextView è una casella di controllo allineata a destra,, è consigliabile utilizzare ciò che è lì.

Poiché ListView controlla lo stato verificato di un elemento di elenco, CheckedTextView non risponde agli eventi di clic e non è selezionabile o attivabile per impostazione predefinita. Tuttavia, risponde a stati pressati e focalizzati, ovvero può ricevere eventi di attivazione e di clic e sembra corretto fino a quando una casella di controllo deve apparire. L'unica cosa che manca è che non commuta il suo stato selezionato al clic. Pertanto, un rapido OnClickListener che chiama .toggle() ti darà il risultato finale che stai cercando.

In sintesi, è necessario 3 cose: cliccabili, attivabile, e onClickListener:

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

e file di 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

Grazie per la spiegazione: non era ovvio, perché questo tipo di controlli potrebbe essere non cliccabile per impostazione predefinita. – Smileek

+4

Ottima risposta. Per fare in modo che CheckedTextView si comporti ancora più simile a un elemento della lista, è necessario impostare lo sfondo su ? Android: attr/listChoiceBackgroundIndicator. – Moritz

+0

_ + 1_ anche per questo http://stackoverflow.com/questions/12641529/unable-to-check-uncheck-checkedtextview-inside-getview – nAkhmedov

0

Se si desidera un controllo più fine su l'etichetta e la casella di controllo, un'altra alternativa è utilizzare RelativeLayout e l'attributo 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> 

è quindi possibile regolare il margine/ecc. Della vista testo e la casella di controllo in base alle proprie esigenze.

9

È possibile utilizzare e alternare CheckedTextView dal seguente senso:

In Layout:

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

Nella vostra attività:

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

E non dimenticate di mettere drawable. Ho capito da SDK ... \ android-sdk-windows \ piattaforme \ android-10 \ Data \ res \ drawable-MDPI \

+0

Grazie, questo ha funzionato alla grande per me. – Jeff

1

Questa disposizione sembra e si comporta allo stesso modo di 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> 

Unico extra legwork è impostare OnClickListener nella vista radice e chiamare checkBox.toggle() su CheckBox.

1

Ecco il mio impiego in 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. In Adapter's 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

dove è variabile mCheckedItem suo no nel mio ArrayAdapter. – JPM

+0

Puoi inserire CheckedTextView ovunque desideri. – Geek4IT

1

risposta è semplice uso: isChecked() metodo anziché 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);    
     } 
    } 
}); 

e ottenere lo stato utilizzando view.isChecked() metodo.