Налаштування прапорець зображення 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.