Özel onay kutusu resmi android


182

Onay kutusu için özel bir resim kullanmanın kolay bir yolu var mı? Gmail'in "yıldızlı" davranışını çoğaltmak istiyorum. Bu yüzden, işaretlendiğinde yıldızla dolu bir onay kutusuna sahip olmak istiyorum. Ve işaretlenmediğinde boş bir yıldızdır. Bir görüntü görüntüleme kullanmalı ve kendi mantığımı kendim mi yapmam gerekiyor?

Yanıtlar:


128

Button'ın çocukları olan onay kutuları, onay kutunuza "Düğme stili" altında burada açıklandığı gibi birkaç durum içeren bir arka plan görüntüsü verebilirsiniz :

... ve burada örneklenmişler :


26
Teşekkürler, aslında tam olarak burada ihtiyacım olanı buldum it-ride.blogspot.com/2010/04/… ama gerçek bir özel görüntü isteseydim bunu yapmak zorunda
kalırdım

2
Teşekkür ederim. Tam olarak ne aradım - Ben tüm devlet şey anladım ama android: android yerine arka plan: düğme ayarladım ve yerine 2 düğme ile sona erdi. Şimdi her şey iyi çalışıyor.
Artem Russakovskii

1
-1. Aşağıdaki android:buttonçözüm, arka plan niteliğini kullanmaktan çok daha iyidir!
Orabîg

8
@ Orabîg: Bu intikam yanlış. Soru mükemmel bir şekilde cevaplandı ("Özel onay kutusu resmi"). Bu özel yıldızlı düğme için bir kısayol bulunması, bu yanıtı geçersiz kılmaz.
ereOn

Bu eski bir yazı olsa da, Android stüdyosunun da android kullandığını eklemek isterim: button = "@ android: drawable / btn_star" yöntemi
Angry 84

289

Çekilebilir bir onay kutusu seçici oluşturun:

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

Onay kutunuzun böyle olduğundan emin olun 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" />

Bu seçiciyi hangi kayıtta belirtiyorsunuz? CheckBox'ı da belirttiğiniz XML dosyasının içinde mi?
Tom Hammond

Tom: Seçicinizi düzenlenebilir klasörde ve onay kutusunda düzen klasöründe oluşturun
Mohamed Hisham Ibn Hanifa

CheckBox'taki ´background´ için ´düğmesi´ değiştirmek zorunda kaldım
Francisco Corrales Morales


2
Api seviye 21 ve android önce söylediğim gibi onay kutumu özelleştiremediğim için projemi android x'e yükselttim: düğme çalışmıyor.
Misagh Aghakhani

44

Btn_check.xml dosyasını android-sdk / platforms / android - # / data / res / drawable'dan projenizin çekilebilir klasörüne kopyalayın ve 'açık' ve 'kapalı' görüntü durumlarını özel resimlerinizle değiştirin.

O zaman xml'nizin android:button="@drawable/btn_check"

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

Farklı varsayılan android simgeleri kullanmak istiyorsanız, android:button="@android:drawable/..."


2
Kötü tavsiye. Simgeler sürümden sürüme değiştirilebilir ve hiç yok olabilir. Varsayılan simgeyi gerçekten seviyorsanız, kaynaklardan yakalayabilirsiniz.
Korniltsev Anatoly

Varsayılan simgelere doğrudan "@android: drawable / ..." üzerinden atıfta bulunmak kötü bir fikir mi yoksa bu süreç tamamen mi?
WOUNDEDStevenJones

2
Örnek: holo simgelerine başvurmak, petek öncesi cihazlarda uygulamanızı kilitler. Bu tür sorunları korumak ve hata ayıklamak gerçekten zordur. Bu yüzden genellikle sadece xml değil, aynı zamanda hundreed görüntüleri de kaynakların bulunacağından emin olun. Ayrıca, kullanıcı arayüzünün her cihazda aynı görünmesini sağlamak için bu çok önemlidir.
Korniltsev Anatoly

15

res / çekilebilir / 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 / düzeni / 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
Bazı açıklamalar yeni kullanıcıların kodunuzun sorunu nasıl çözdüğünü anlamalarına yardımcı olur.
Brian Tompsett - 莱恩 莱恩

7

Android açık kaynak kodunuz varsa, stil tanımını aşağıda bulabilirsiniz:
src / frameworks / base / core / res / res / değerleri

<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

Dene -

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

Bu özelliği ekle -

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

Gibi kullanın -

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

Tüm sorunlarınızı düzeltir.


onSaveInstanceState()Ve onRestoreInstanceState()yöntemleri eksik , ben kontrol durumu rotasyonda kaybolacağını düşünüyorum
EpicPandaForce

2

Başka bir seçenek de boş arka plana ve özel bir düğmeye sahip bir ToggleButton kullanmaktır .

Metin rengine de bir seçici içeren bir örnek.

<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

Onay kutusunu kullanırken liste öğelerini tıklanabilir hale getirmek için özel bağdaştırıcılar kullanıyorsanız android:focusable="false"ve android:focusableInTouchMode="false"kullanmanız gerekiyorsa.

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

Gelen çekilebilir> 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

Eğer kullanırsanız androidx.appcompat: AppCompat ve (tip bir özel çekilebilir istiyorum selectorile android:state_checkedyeni platform versiyonlarına ek olarak, eski bir platform sürümleri üzerinde çalışmaya), kullanılmakta gerek

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

onun yerine

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

1

Enselic ve Rahul cevaplarına dayanarak.

Benim için çalışıyor (API 21'den önce ve sonra):

<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" />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.