Android: ระบุภาพสองภาพที่แตกต่างกันสำหรับปุ่มสลับโดยใช้ XML


100

ฉันกำลังพยายามลบล้างToggleButtonรูปลักษณ์เริ่มต้น นี่คือ XML ที่กำหนด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"/>

ตอนนี้เรามีไอคอน 30 x 30 สองไอคอนที่เราต้องการใช้สำหรับสถานะที่คลิก / ไม่คลิก ตอนนี้เรามีรหัสที่เปลี่ยนไอคอนพื้นหลังโดยทางโปรแกรมขึ้นอยู่กับสถานะ:

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

เห็นได้ชัดว่าฉันกำลังมองหาวิธีที่ดีกว่านี้ในการทำเช่นนี้ ฉันพยายามสร้างตัวเลือกสำหรับภาพพื้นหลังซึ่งจะสลับระหว่างสถานะโดยอัตโนมัติ:

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

แต่ไม่ได้ผล อ่านToggleButtonAPI ( http://developer.android.com/reference/android/widget/ToggleButton.html ) ดูเหมือนว่าแอตทริบิวต์ xml ที่สืบทอดมามีเพียง

    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. 

ดูเหมือนจะไม่มีแอตทริบิวต์ android: state_checked แม้ว่าคลาสจะมีเมธอดก็ตาม isChecked()และsetChecked().

มีวิธีทำตามที่ฉันต้องการใน XML หรือไม่หรือฉันติดอยู่กับวิธีแก้ปัญหาที่ยุ่งเหยิงของฉัน?


CompoundButtonหมายเหตุถ้าคุณไม่ได้ใช้ข้อความที่ผมคิดว่ามันอาจจะดีกว่าที่จะใช้
Timmmm

1
ไม่สนใจว่า; CompoundButtonเป็นนามธรรม!
Timmmm

คำตอบ:


159

รหัสของคุณเรียบร้อยดี อย่างไรก็ตามปุ่มสลับจะแสดงรายการแรกในตัวเลือกของคุณที่ตรงกันดังนั้นค่าเริ่มต้นควรอยู่ในอันดับสุดท้าย จัดเรียงรายการในลักษณะต่อไปนี้เพื่อให้แน่ใจว่าจะถูกนำไปใช้ทั้งหมด:

<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
นั่นเป็นเหตุผลที่ดี ฉันไม่เคยทำการเชื่อมต่อระหว่างคำสั่งตัวเลือกและสวิตช์
I82

คุณทำให้วันของฉัน ... ฉันมีปัญหาเกี่ยวกับปุ่มช่องทำเครื่องหมายแล้วลองใช้ปุ่มตัวเลือกเช่นกันในที่สุดโพสต์นี้ก็มีประโยชน์ ขอบคุณมาก Vitaly Polonetsky และ I82Much
David Prun

8
เอกสารบางแห่งบอกว่าอ่านจากด้านบนหยุดที่สถานะแรกซึ่งตรงตามเงื่อนไขทั้งหมดดังนั้นหากค่าเริ่มต้นอยู่ที่ด้านบนสุดจะไม่มีทางผ่านพ้นไปได้
Travis

1
มากswitchมักจะเลือก "หนึ่งที่ถูกต้อง" โดยไม่คำนึงถึงคำสั่งนี้จะทำงานเหมือนยาวif-elseif-elseif-elsestate_x == true && state_y == false && state_z = trueที่มีสภาพเช่น
TWiStErRob
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.