Existe-t-il un moyen simple d'utiliser une image personnalisée pour une case à cocher? Je cherche à dupliquer le comportement "étoilé" de gmail. Je veux donc avoir une case à cocher qui, lorsqu'elle est cochée, est une étoile remplie. Et quand elle n'est pas cochée, c'est une étoile vide. Dois-je utiliser une imageview et faire ma propre logique moi-même?
185
android:button
solution ci-dessous est bien meilleure que l'utilisation de l'attribut d'arrière-plan!Créez un sélecteur de case à cocher dessinable:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/checkbox" android:state_checked="false"/> <item android:drawable="@drawable/checkboxselected" android:state_checked="true"/> <item android:drawable="@drawable/checkbox"/> </selector>
Assurez-vous que votre case à cocher est comme ceci
android:button="@drawable/checkbox_selector"
<CheckBox android:layout_width="match_parent" android:layout_height="wrap_content" android:button="@drawable/checkbox_selector" android:text="CheckBox" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="@color/Black" />
la source
Copiez le btn_check.xml de android-sdk / plates-formes / android - # / data / res / drawable dans le dossier dessinable de votre projet et modifiez les états d'image «on» et «off» en vos images personnalisées.
Ensuite, votre xml aura juste besoin
android:button="@drawable/btn_check"
<CheckBox android:button="@drawable/btn_check" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" />
Si vous souhaitez utiliser différentes icônes Android par défaut, vous pouvez utiliser
android:button="@android:drawable/..."
la source
res / drawable / day_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/dayselectionunselected" android:state_checked="false"/> <item android:drawable="@drawable/daysselectionselected" android:state_checked="true"/> <item android:drawable="@drawable/dayselectionunselected"/> </selector>
res / layout / my_layout.xml
<CheckBox android:id="@+id/check" android:layout_width="39dp" android:layout_height="39dp" android:background="@drawable/day_selector" android:button="@null" android:gravity="center" android:text="S" android:textColor="@color/black" android:textSize="12sp" />
la source
Si vous avez du code open source Android, vous pouvez trouver la définition des styles sous:
src / frameworks / base / core / res / res / values
<style name="Widget.CompoundButton.CheckBox"> <item name="android:background"> @android:drawable/btn_check_label_background </item> <item name="android:button"> ?android:attr/listChoiceIndicatorMultiple </item> </style>
la source
Essayez-le -
package com; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; public class CheckBoxImageView extends ImageView implements View.OnClickListener { boolean checked; int defImageRes; int checkedImageRes; OnCheckedChangeListener onCheckedChangeListener; public CheckBoxImageView(Context context, AttributeSet attr, int defStyle) { super(context, attr, defStyle); init(attr, defStyle); } public CheckBoxImageView(Context context, AttributeSet attr) { super(context, attr); init(attr, -1); } public CheckBoxImageView(Context context) { super(context); } public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; setImageResource(checked ? checkedImageRes : defImageRes); } private void init(AttributeSet attributeSet, int defStyle) { TypedArray a = null; if (defStyle != -1) a = getContext().obtainStyledAttributes(attributeSet, R.styleable.CheckBoxImageView, defStyle, 0); else a = getContext().obtainStyledAttributes(attributeSet, R.styleable.CheckBoxImageView); defImageRes = a.getResourceId(0, 0); checkedImageRes = a.getResourceId(1, 0); checked = a.getBoolean(2, false); a.recycle(); setImageResource(checked ? checkedImageRes : defImageRes); setOnClickListener(this); } @Override public void onClick(View v) { checked = !checked; setImageResource(checked ? checkedImageRes : defImageRes); onCheckedChangeListener.onCheckedChanged(this, checked); } public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) { this.onCheckedChangeListener = onCheckedChangeListener; } public static interface OnCheckedChangeListener { void onCheckedChanged(View buttonView, boolean isChecked); } }
Ajouter cet attrib -
<declare-styleable name="CheckBoxImageView"> <attr name="default_img" format="integer"/> <attr name="checked_img" format="integer"/> <attr name="checked" format="boolean"/> </declare-styleable>
Utiliser comme -
<com.adonta.ziva.consumer.wrapper.CheckBoxImageView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/checkBox" android:layout_width="40dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:clickable="true" android:padding="5dp" app:checked_img="@drawable/check_box_checked" app:default_img="@drawable/check_box" />
Il corrigera tous vos problèmes.
la source
onSaveInstanceState()
etonRestoreInstanceState()
, je pense que l'état vérifié serait perdu lors de la rotationUne autre option consiste à utiliser un ToggleButton avec un arrière-plan nul et un bouton personnalisé.
Ci-dessous un exemple qui inclut également un sélecteur de couleur de texte.
<ToggleButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:button="@drawable/toggle_selector" android:background="@null" android:paddingLeft="10dp" android:layout_centerHorizontal="true" android:gravity="center" android:textColor="@drawable/toggle_text" android:textOn="My on state" android:textOff="My off state" />
toggle_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/state_on" /> <item android:drawable="@drawable/state_off" /> </selector>
toggle_text.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:color="@color/app_color" /> <item android:color="@android:color/darker_gray" /> </selector>
la source
Si vous utilisez des adaptateurs personnalisés,
android:focusable="false"
et queandroid:focusableInTouchMode="false"
vous souhaitez que les éléments de liste soient cliquables lors de l'utilisation de la case à cocher.<CheckBox android:id="@+id/checkbox_fav" android:focusable="false" android:focusableInTouchMode="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:button="@drawable/checkbox_layout"/>
Dans drawable> checkbox_layout.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/uncked_checkbox" android:state_checked="false"/> <item android:drawable="@drawable/selected_checkbox" android:state_checked="true"/> <item android:drawable="@drawable/uncked_checkbox"/> </selector>
la source
Si vous utilisez androidx.appcompat: appcompat et que vous souhaitez qu'un dessin personnalisé (de type
selector
withandroid:state_checked
) fonctionne sur les anciennes versions de plate-forme en plus des nouvelles versions de plate-forme, vous devez utiliser<CheckBox app:buttonCompat="@drawable/..."
au lieu de
<CheckBox android:button="@drawable/..."
la source
Basé sur les réponses d'Enselic et Rahul.
Cela fonctionne pour moi (avant et après l'API 21):
<CheckBox android:id="@+id/checkbox" android:layout_width="40dp" android:layout_height="40dp" android:text="" android:gravity="center" android:background="@drawable/checkbox_selector" android:button="@null" app:buttonCompat="@null" />
la source