Android: Chỉ định hai hình ảnh khác nhau cho nút chuyển đổi bằng XML


100

Tôi đang cố gắng ghi đè giao diện mặc định ToggleButton. Đây là XML xác định ToggleButton:

<ToggleButton android:id="@+id/FollowAndCenterButton"
        android:layout_width="30px"
        android:layout_height="30px"
        android:textOn="" android:textOff="" android:layout_alignParentLeft="true"
        android:layout_marginLeft="5px"
        android:layout_marginTop="5px" android:background="@drawable/locate_me"/>

Bây giờ, chúng tôi có hai biểu tượng 30 x 30 mà chúng tôi muốn sử dụng cho các trạng thái được nhấp / không được nhấp. Ngay bây giờ, chúng tôi có mã thay đổi biểu tượng nền theo chương trình tùy thuộc vào trạng thái:

centeredOnLocation.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (centeredOnLocation.isChecked()) {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me_on));
            } else {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me));
            }
        }
});

Rõ ràng là tôi đang tìm kiếm một cách tốt hơn để làm điều này. Tôi đã cố gắng tạo một bộ chọn cho hình nền, bộ chọn này sẽ tự động chuyển đổi giữa các trạng thái:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@drawable/locate_me" /> <!-- default -->
 <item android:state_checked="true"
       android:drawable="@drawable/locate_me_on" /> <!-- pressed -->
 <item android:state_checked="false"
       android:drawable="@drawable/locate_me" /> <!-- unchecked -->

Dường như không hiệu quả; đọc ToggleButtonAPI ( http://developer.android.com/reference/android/widget/ToggleButton.html ), có vẻ như các thuộc tính xml được kế thừa duy nhất là

    XML Attributes
Attribute Name  Related Method  Description
android:disabledAlpha       The alpha to apply to the indicator when disabled. 
android:textOff         The text for the button when it is not checked. 
android:textOn      The text for the button when it is checked. 

Dường như không có thuộc tính android: state_checked, mặc dù lớp có phương thức isChecked()setChecked().

Vì vậy, có cách nào để thực hiện những gì tôi muốn trong XML, hay tôi bị mắc kẹt với cách giải quyết lộn xộn của mình?


Lưu ý, nếu bạn không sử dụng văn bản, tôi nghĩ có thể sử dụng tốt hơn CompoundButton.
Timmmm

1
Bỏ qua điều đó; CompoundButtonlà trừu tượng!
Timmmm

Câu trả lời:


159

Mã của bạn là tốt. Tuy nhiên, nút bật tắt sẽ hiển thị mục đầu tiên trong bộ chọn của bạn mà nó phù hợp, vì vậy mục mặc định sẽ đến sau cùng. Sắp xếp các mục theo cách sau để đảm bảo chúng sẽ được sử dụng hết:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:state_pressed="true" /> //currently pressed turning the toggle on
    <item android:state_pressed="true" /> //currently pressed turning the toggle off
    <item android:state_checked="true" /> //not pressed default checked state
    <item /> //default non-pressed non-checked
</selector>

3
Điều đó có ý nghĩa hoàn hảo; Tôi chưa bao giờ thực hiện kết nối giữa các câu lệnh bộ chọn và công tắc.
I82Much

Bạn đã làm nên ngày của tôi ... Tôi gặp sự cố với nút, hộp kiểm và sau đó cũng thử nút radio, cuối cùng bài đăng này cũng hữu ích. Thank you very much Vitaly Polonetsky và I82Much
David Prun

8
tài liệu ở đâu đó nói rằng nó đọc từ trên cùng, dừng lại ở trạng thái đầu tiên mà các điều kiện đều được đáp ứng, vì vậy nếu mặc định ở trên cùng, nó sẽ không bao giờ vượt qua mức có thể vẽ được.
Travis

1
@ I82Nhiều a switchsẽ luôn chọn "đúng" bất kể thứ tự, điều này có vẻ dài dòng hơn if-elseif-elseif-elsevới các điều kiện như state_x == true && state_y == false && state_z = true.
TWiStErRob
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.