多状态切换按钮

Mel*_*lde 19 user-interface android button togglebutton

在我一直在努力的应用程序中,我希望有一个多状态(在我的情况下,三个)切换按钮,而不是提供的两个ToggleButton.我已经尝试Button按照CompoundButton源代码开始扩展自己,但老实说,阅读它的来源有点压倒性.

有没有办法只使用选择器xml或其他东西做一个三态切换按钮,或者可能是另一种我没想过的方法?我不知道该怎么做.

jlh*_*ora 19

我实现了一个多状态切换按钮,源代码在这里

这是它的样子:

在此输入图像描述

它很容易使用它:

<org.honorato.multistatetogglebutton.MultiStateToggleButton
    android:id="@+id/mstb_multi_id"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip"
    mstb:values="@array/planets_array" />
Run Code Online (Sandbox Code Playgroud)

在您的活动中:

MultiStateToggleButton button2 = (MultiStateToggleButton) this.findViewById(R.id.mstb_multi_id);
button2.setOnValueChangedListener(new ToggleButton.OnValueChangedListener() {
    @Override
    public void onValueChanged(int value) {
        Log.d(TAG, "Value: " + value);
    }
});
Run Code Online (Sandbox Code Playgroud)


dav*_*ron 12

您可以创建自定义ImageButton来实现此目的,在这种情况下您需要3个不同的图像.如果需要,您还可以添加更多状态.

public class FlashButton extends ImageButton {

    public enum FlashEnum {
        AUTOMATIC, ON, OFF
    }

    public interface FlashListener {
        void onAutomatic();
        void onOn();
        void onOff();
    }

    private FlashEnum mState;
    private FlashListener mFlashListener;

    public FlashButton(Context context, AttributeSet attrs) {
        super(context, attrs);

        //Sets initial state
        setState(FlashEnum.AUTOMATIC);
    }


    @Override
    public boolean performClick() {
        super.performClick();
        int next = ((mState.ordinal() + 1) % FlashEnum.values().length);
        setState(FlashEnum.values()[next]);
        performFlashClick();
        return true;
    }


    private void performFlashClick() {
        if(mFlashListener == null)return;
        switch (mState) {
            case AUTOMATIC:
                mFlashListener.onAutomatic();
                break;
            case ON:
                mFlashListener.onOn();
                break;
            case OFF:
                mFlashListener.onOff();
                break;
        }
    }

    private void createDrawableState() {
        switch (mState) {
            case AUTOMATIC:
                setImageResource(R.drawable.ic_flash_auto);
                break;
            case ON:
                setImageResource(R.drawable.ic_flash_on);
                break;
            case OFF:
                setImageResource(R.drawable.ic_flash_off);
                break;
        }
    }


    public FlashEnum getState() {
        return mState;
    }

    public void setState(FlashEnum state) {
        if(state == null)return;
        this.mState = state;
        createDrawableState();

    }

    public FlashListener getFlashListener() {
        return mFlashListener;
    }

    public void setFlashListener(FlashListener flashListener) {
        this.mFlashListener = flashListener;
    }

}
Run Code Online (Sandbox Code Playgroud)


Ted*_*opp 10

您当然可以定义一个选择器用作具有三个条目的背景.问题是您可以将哪些按钮属性用于选择器.您可以有两个布尔属性,例如A和B,并根据A,B和默认值定义选择器.(A && B将满足A,因此更恰当地可以将它们视为A,!A && B,以及!A &&!B.)您可以重载现有属性(选择,聚焦等),或者更优雅,使用此线程中描述的配方定义您自己的自定义属性.


Aet*_*rna 7

RadioGroup为什么不在里面使用和设计收音机呢?

 <RadioGroup
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <RadioButton
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:background="@drawable/your_drawable_selector"
        android:button="@android:color/transparent"
        android:gravity="center_horizontal" //center text
        android:text="text"
         />
...
Run Code Online (Sandbox Code Playgroud)