Подтвердить что ты не робот

Кнопка переключения нескольких состояний

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Для этого вы можете создать пользовательский 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;
    }

}

Ответ 4

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