Как изменить изображения по умолчанию CheckBox - PullRequest
42 голосов
/ 16 октября 2011

Я использую ListView, и для каждой строки у меня есть row_item.xml, и я надуваю это в коде

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <CheckBox
        android:id="@+id/chk"
        android:layout_alignParentLeft="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/txtChoice"
        android:textColor="#FF0000"
        android:text="TEST"
        android:layout_toRightOf="@id/chk"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" /> 
</RelativeLayout>

Как изменить этот флажок, используя другое изображение custom_1, когда отмечено, и другое изображение custom_2, когда не отмечено?

Ответы [ 4 ]

143 голосов
/ 16 октября 2011

Drawable customdrawablecheckbox.xml :

<?xml version="1.0" encoding="utf-8"?>
<selector  xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_checked="false" android:drawable="@drawable/unchecked_drawable" />
     <item android:state_checked="true" android:drawable="@drawable/checked_drawable" />
     <item android:drawable="@drawable/unchecked_drawable" /> <!-- default state -->
</selector>

yourcheckbox xml:

<CheckBox
    android:id="@+id/chk"
    android:button="@drawable/customdrawablecheckbox"
    android:layout_alignParentLeft="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
9 голосов
/ 16 октября 2011
Флажок

- это кнопка, поэтому вы можете предоставить свой собственный объект для рисования с состоянием флажка и его фоном.Например,

<?xml version="1.0" encoding="utf-8"?>
<selector  xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="false" android:drawable="@drawable/yourdrawable1" />
<item android:state_checked="true" android:drawable="@drawable/yourdrawable2" />
<item android:drawable="@drawable/yourdrawable1" /> <!-- default -->
 </selector>

и поместите это в файл file.xml в вашей папке для рисования.В вашем флажке:

  <CheckBox
    android:button="@drawable/file"
    android:id="@+id/chk"
    android:layout_alignParentLeft="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
4 голосов
/ 16 октября 2011

Это довольно просто :) Сначала вам нужно создать класс CustomCheckBox, который расширит CheckBox и переопределит метод onDraw(Canvas canvas):

public class CustomCheckBox extends CheckBox {
private final Drawable buttonDrawable;

public CustomCheckBox(Context context, AttributeSet set) {
    super(context, set);
    buttonDrawable = getResources().getDrawable(R.drawable.custom_check_box);
    try {
        setButtonDrawable(android.R.color.transparent);
    } catch (Exception e) {
        // DO NOTHING
    }
    setPadding(10, 5, 50, 5);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    buttonDrawable.setState(getDrawableState());

    final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK;
    final int height = buttonDrawable.getIntrinsicHeight();
    if (buttonDrawable != null) {
        int y = 0;

        switch (verticalGravity) {
        case Gravity.BOTTOM:
            y = getHeight() - height;
            break;
        case Gravity.CENTER_VERTICAL:
            y = (getHeight() - height) / 2;
            break;
        }

        int buttonWidth = buttonDrawable.getIntrinsicWidth();
        int buttonLeft = getWidth() - buttonWidth - 5;
        buttonDrawable.setBounds(buttonLeft, y, buttonLeft + buttonWidth, y + height);
        buttonDrawable.draw(canvas);
    }
}
}

Также создайте ваш селектор с именем custom_check_box в вашей папке для рисования:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:state_window_focused="false" 
        android:drawable="@drawable/btn_check_on" />
    <item android:state_checked="false" android:state_window_focused="false"
        android:drawable="@drawable/btn_check_off" />
    <item android:state_checked="true" android:state_pressed="true"
        android:drawable="@drawable/btn_check_on" />    
    <item android:state_checked="false" android:state_focused="true"
        android:drawable="@drawable/btn_check_off" />
    <item android:state_checked="false" android:drawable="@drawable/btn_check_off" />
    <item android:state_checked="true" android:drawable="@drawable/btn_check_on" />
</selector>

И используйте ваши пользовательские значки / изображения в приведенном выше XML для всех трех состояний (сфокусировано / нажато / по умолчанию)

Используйте пользовательский компонент в вашем XML следующим образом:

<*package + class path*.CustomCheckBox   // example com.mypackage.ui.CustomCheckBox if your project is named "mypackage" and the class is in the "ui" folder
            android:text="@string/text"
            android:checked="false" android:layout_width="fill_parent"
            android:id="@+id/myCheckbox" android:layout_height="wrap_content"/>

и java:

private CustomCheckBox mCheckbox;
mCheckbox = (CustomCheckBox) findviewbyid(R.id.myCheckbox);

Это работает, потому что я использовал его в обоих направлениях :) И с некоторыми настройками он работает для RadioButtons тоже одинаково.Удачного кодирования!

0 голосов
/ 05 февраля 2018

Вы можете использовать селектор в xml, который используется для динамического изменения изображения флажка в соответствии с его отмеченным состоянием.

Например:

<item android:drawable="@drawable/ic_linkedin" android:state_checked="true" />
<item android:drawable="@drawable/ic_linkedin_disabled" android:state_checked="false" />

Если в следующем файле установлен флажок, будет установлен значок ic_linkedin, а если флажок снят, он будет установленустановить значок ic_linkedin_disabled.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...