Многоуровневая кнопка переключения - PullRequest
19 голосов
/ 28 января 2011

В приложении, над которым я работал, мне бы хотелось иметь кнопку с несколькими состояниями (в моем случае три) вместо двух, которые предоставляет ToggleButton. Я пытался начать свой собственный, который расширяет Button, следуя источнику CompoundButton, но, честно говоря, чтение по его источнику стало немного ошеломляющим.

Есть ли способ сделать кнопку с тремя состояниями, используя только селектор XML или что-то, или, возможно, другой метод, о котором я не думал? Я скорее в недоумении, как это сделать.

Ответы [ 4 ]

19 голосов
/ 29 января 2014

Я реализовал кнопку переключения нескольких состояний, исходный код здесь

Вот как это выглядит:

enter image description here

И его довольно просто использовать:

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

В вашей деятельности:

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);
    }
});
11 голосов
/ 17 октября 2014

Вы можете создать собственную кнопку 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;
    }

}
10 голосов
/ 28 января 2011

Вы, безусловно, можете определить селектор для использования в качестве фона, который имеет три записи. Вопрос в том, какие атрибуты кнопок можно использовать для селектора. Вы можете иметь два логических атрибута, скажем, A и B, и определять селектор в терминах A, B и default. (A && B удовлетворит A, поэтому правильнее их можно рассматривать как A,! A && B и! A &&! B.) Вы можете перегрузить существующие атрибуты (выбранные, выделенные и т. Д.) Или, что более элегантно, определите свои собственные атрибуты, используя рецепт, описанный в этой теме .

2 голосов
/ 09 марта 2016

Почему бы не использовать 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"
         />
...
...