Налаштування прапорець зображення Android


182

Чи є простий спосіб використовувати нестандартне зображення для прапорця? Я хочу дублювати "зіркову" поведінку gmail. Тому я хочу мати прапорець, який, коли він встановлений, є заповненою зіркою. А коли неперевірений - порожня зірка. Чи потрібно використовувати перегляд зображень і виконувати власну логіку самостійно?

Відповіді:


128

Якщо ви не є дітьми кнопки, ви можете просто надати на ваш прапорець фонове зображення з кількома станами, як описано тут , під "Стилем кнопки":

... і наводимо приклад тут :


26
Дякую, я насправді знайшов саме те, що мені потрібно тут it-ride.blogspot.com/2010/04/…, але мені довелося б зробити це так, якби я хотів справжнє зображення на замовлення = P
Falmarri

2
Дякую. Точно те, що я шукав - я розібрався з цілим станом, але я встановив андроїд: фон замість android: кнопка, а в кінцевому підсумку - 2 кнопки. Зараз це все добре працює.
Артем Русаковський,

1
-1. android:buttonРішення нижче набагато краще , ніж при використанні атрибута фону!
Orabîg

8
@ Orabîg: Цей потік неправильний. На це питання чудово відповідає ("Спеціальне зображення прапорця"). Те, що існує ярлик для цієї конкретної кнопки із зіркою, не відповідає цій відповіді.
квітня 12

Хоча це, можливо, стара публікація, хотілося б додати, що Android-студія також використовує метод android: button = "@ android: dravable / btn_star"
Angry 84

288

Створіть перемикач віконця:

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

У якому записі ви вказуєте цей селектор? У самому файлі XML, де ви також вказуєте CheckBox?
Том Хаммонд

Том: створіть свій вибір у папці, що перетягується, і прапорець у папці макета
Mohamed Hisham Ibn Hanifa

Мені довелося змінити "кнопку" на "заднім майданчиком" у CheckBox
Francisco Corrales Morales

Для заповнення см stackoverflow.com/questions/4037795 / ...
PiTheNumber

2
Я модернізував свій проект до android x після цього, я не зміг налаштувати свій прапорець, як ви сказали перед api рівня 21 та android: кнопка не працює.
Місаг Агахані

44

Скопіюйте btn_check.xml з android-sdk / platforms / android - # / data / res / dravable в папку, що витягується, і змініть стан "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/..."


2
Погана порада. Піктограми можуть бути змінені від версії до версії і можуть взагалі зникнути. Якщо вам дуже подобається піктограма за замовчуванням, ви можете схопити її з джерел.
Корнільцев Анатолій

Ви хочете сказати, що посилання на піктограми за замовчуванням безпосередньо через "@android: dravable / ..." - це погана ідея, або цей процес цілком?
ВІДПОВІДАвСтевенДжонс

2
Приклад: посилання на піктограми holo призведе до збою вашої програми на пристроях, що попередньо живлять соти. Підтримувати та налагоджувати подібні неприємності справді важко. Тому я зазвичай копіюю не лише xml, але й зображення, щоб бути настільки впевненими, що ресурси знайдуться. Також це дуже важливо для того, щоб інтерфейс користувача виглядав однаково на всіх пристроях.
Корнільцев Анатолій

15

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

1
Деякі пояснення допоможуть новим користувачам зрозуміти, як вирішує проблему ваш код.
Брайан Томпсетт - 汤 莱恩

7

Якщо у вас є відкритий вихідний код Android, ви можете знайти визначення стилів у розділі:
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>

4

Спробуй це -

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

Додати цю attrib -

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

Це виправить усі ваші переписки.


Не вистачає onSaveInstanceState()і onRestoreInstanceState()методів, я думаю, що перевірений стан буде втрачено при обертанні
EpicPandaForce

2

Інший варіант - використання ToggleButton з нульовим фоном та спеціальною кнопкою.

Нижче наведено приклад, що включає також селектор до кольору тексту.

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

2

Якщо ви використовуєте для користувача адаптери , ніж android:focusable="false"та android:focusableInTouchMode="false"є nessesury , щоб елементи списку клікабельні, використовуючи прапорець.

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

1

Якщо ви використовуєте androidx.appcompat: appcompat і хочете, щоб користувальницький малюнок (типу selectorз android:state_checked) працював на старих версіях платформи на додаток до нових версій платформи, вам потрібно використовувати

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

замість

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

1

На основі відповідей Енселіка та Рахуля.

Він працює для мене (до та після 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" />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.