Hình ảnh hộp kiểm tùy chỉnh android


182

Có cách nào dễ dàng để sử dụng hình ảnh tùy chỉnh cho hộp kiểm không? Tôi đang tìm cách nhân đôi hành vi "đánh dấu sao" của gmail. Vì vậy, tôi muốn có một hộp kiểm, khi được chọn, là một ngôi sao được điền đầy đủ. Và khi không được kiểm tra là một ngôi sao trống. Tôi có phải sử dụng chế độ xem hình ảnh và tự làm logic không?

Câu trả lời:


128

Các hộp kiểm là con của Nút, bạn chỉ có thể cung cấp cho hộp kiểm của mình một hình nền với một số trạng thái như được mô tả ở đây , trong "Kiểu nút":

... và được minh họa ở đây :


26
Cảm ơn, tôi thực sự tìm thấy chính xác những gì tôi cần ở đây it-ride.blogspot.com/2010/04/... nhưng tôi sẽ phải làm điều đó theo cách của bạn nếu tôi muốn có một thực hình ảnh tùy chỉnh = P
Falmarri

2
Cảm ơn bạn. Chính xác những gì tôi đang tìm kiếm - Tôi đã tìm ra toàn bộ trạng thái nhưng tôi đã thiết lập android: nền thay vì android: nút và kết thúc bằng 2 nút thay thế. Bây giờ tất cả đều hoạt động tốt.
Artem Russakovskii

1
-1. Các android:buttongiải pháp dưới đây là tốt hơn nhiều so với sử dụng thuộc tính background!
Orabîg

8
@ Orabîg: Downvote này là sai. Câu hỏi được trả lời hoàn hảo ("Hình ảnh hộp kiểm tùy chỉnh"). Việc một phím tắt tồn tại cho nút được gắn dấu sao cụ thể này không làm mất hiệu lực câu trả lời này.
vào

Mặc dù đây có thể là một bài viết cũ, nhưng muốn thêm rằng studio Android cũng sử dụng phương thức android: button = "@ android: drawable / btn_star"
Angry 84

289

Tạo một bộ chọn hộp kiểm có thể vẽ:

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

Hãy chắc chắn rằng hộp kiểm của bạn giống như thế này 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" />

Bản ghi nào bạn chỉ định bộ chọn này trong? Trong chính tệp XML nơi bạn cũng chỉ định CheckBox?
Tom Hammond

Tom: tạo bộ chọn của bạn trong thư mục có thể vẽ và hộp kiểm trong thư mục bố cục
Mohamed Hisham Ibn Hanifa

Tôi đã phải thay đổi ỏbutton, đổi lấy oundbackground, trong CheckBox
Francisco Corrales Morales

Để biết phần đệm, hãy xem stackoverflow.com/questions/4037795/õ
PiTheNumber

2
Tôi đã nâng cấp dự án của mình lên Android x sau đó tôi không thể tùy chỉnh hộp kiểm của mình như bạn đã nói trước khi api cấp 21 và android: nút không hoạt động.
Misagh Aghakhani

44

Sao chép btn_check.xml từ android-sdk / platform / android - # / data / res / drawable vào thư mục có thể vẽ của dự án của bạn và thay đổi trạng thái hình ảnh 'bật' và 'tắt' thành hình ảnh tùy chỉnh của bạn.

Sau đó, xml của bạn sẽ chỉ cần android:button="@drawable/btn_check"

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

Nếu bạn muốn sử dụng các biểu tượng Android mặc định khác nhau, bạn có thể sử dụng android:button="@android:drawable/..."


2
Lời khuyên tệ. Các biểu tượng có thể được thay đổi từ phiên bản này sang phiên bản khác và có thể biến mất hoàn toàn. Nếu bạn thực sự thích biểu tượng mặc định, bạn có thể lấy nó từ các nguồn.
Korniltsev Anatoly

Bạn đang nói rằng việc tham khảo các biểu tượng mặc định trực tiếp thông qua "@android: drawable / ..." là một ý tưởng tồi hay quá trình này hoàn toàn?
WOUNDEDStevenJones

2
Ví dụ: tham chiếu đến các biểu tượng holo sẽ làm hỏng ứng dụng của bạn trên các thiết bị tiền tổ ong. Thật sự rất khó để duy trì và gỡ lỗi những rắc rối như vậy. Vì vậy, tôi thường sao chép không chỉ xml mà cả hình ảnh cũng có thể là phần trăm chắc chắn các tài nguyên sẽ được tìm thấy. Ngoài ra, điều này rất quan trọng để đảm bảo UI trông giống nhau trên mọi thiết bị.
Korniltsev Anatoly

15

res / drawable / 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
Một số giải thích sẽ giúp người dùng mới hiểu cách mã của bạn giải quyết vấn đề.
Brian Tompsett - 汤

7

Nếu bạn có mã nguồn mở Android, bạn có thể tìm thấy định nghĩa kiểu trong:
src / frameworks / 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>

4

Thử nó -

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

Thêm chú thích này -

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

Sử dụng như -

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

Nó sẽ sửa chữa tất cả các biểu tượng của bạn.


Nó thiếu onSaveInstanceState()onRestoreInstanceState()các phương thức, tôi nghĩ rằng trạng thái đã kiểm tra sẽ bị mất khi xoay vòng
EpicPandaForce

2

Một tùy chọn khác là sử dụng ToggleButton với nền null và nút tùy chỉnh.

Dưới đây là một ví dụ bao gồm một bộ chọn cho màu văn bản.

<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 bản

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

Nếu bạn đang sử dụng bộ điều hợp tùy chỉnh hơn android:focusable="false"android:focusableInTouchMode="false"không cần thiết để làm cho các mục danh sách có thể nhấp trong khi sử dụng hộp kiểm.

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

Trong drawable> box_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

Nếu bạn sử dụng androidx.appcompat: appcompat và muốn có thể vẽ tùy chỉnh (loại selectorandroid:state_checked) để hoạt động trên các phiên bản nền tảng cũ ngoài các phiên bản nền tảng mới, bạn cần sử dụng

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

thay vì

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

1

Dựa trên câu trả lời của Enselic và Rahul.

Nó hoạt động với tôi (trước và sau 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" />
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.