自定义复选框图像机器人

有没有一种简单的方法来为复选框使用自定义图像?我正在寻找复制的“星级”行为的 gmail。所以我想要有一个复选框,当选中时,是一个填充的星星。如果没有检查,就是一颗空星。我必须使用一个图像视图,并做我自己的逻辑自己吗?

252496 次浏览

复选框是按钮的孩子你可以只给你的复选框一个背景图像与几个状态描述 给你,在“按钮样式”下:

给你为例:

将 android-sdk/Platform/android-#/data/res/draable 中的 btn _ check.xml 复制到项目的可绘制文件夹中,并将“ on”和“ off”图像状态更改为自定义图像。

然后您的 xml 将只需要 android:button="@drawable/btn_check"

<CheckBox
android:button="@drawable/btn_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true" />

如果要使用不同的默认 Android 图标,可以使用 android:button="@android:drawable/..."

如果你有 Android 开源代码,你可以在下面找到样式定义:
Src/Framework/base/core/res/res/value

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

创建一个可绘制的复选框选择器:

<?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>

确保您的复选框类似于 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" />

试试看

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

添加此属性-

<declare-styleable name="CheckBoxImageView">
<attr name="default_img" format="integer"/>
<attr name="checked_img" format="integer"/>
<attr name="checked" format="boolean"/>
</declare-styleable>

使用喜欢-

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

它会解决你所有的问题。

另一种选择是使用带有空背景和自定义按钮的 切换按钮

下面是一个包含文本颜色选择器的示例。

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

如果您正在使用自定义适配器比 android:focusable="false"android:focusableInTouchMode="false"是必要的,使列表项目可点击同时使用复选框。

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

可绘制 > checkbox _ layent.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>

Res/draable/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/lay.xml/my _ lay.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" />

如果您使用 Appcompat: appcompat并且希望自定义绘图(类型为 selectorandroid:state_checked)除了在新的平台版本之外还能在旧的平台版本上工作,那么您需要使用

    <CheckBox
app:buttonCompat="@drawable/..."

而不是

    <CheckBox
android:button="@drawable/..."

根据恩塞利克和拉胡尔的回答。

它适合我(在 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" />

在 android: 按钮中添加自定义绘制对我来说在材质复选框 version-1.3.0中不起作用。我不得不设置 android:drawable="@drawable/checkbox_selector",而且还设置 android:button="@null"。您还可以添加 android:drawablePadding,使其看起来不错。但是,这使得整个复选框(连同文本)可以单击。