web-dev-qa-db-ja.com

マルチステートトグルボタン

私が取り組んでいるアプリでは、ToggleButtonが提供する2つではなく、複数の状態(私の場合は3つ)のトグルボタンが必要です。 Buttonソースに続いてCompoundButtonを拡張する独自のものを開始しようとしましたが、正直に言って、そのソースを読むのは少し圧倒されました。

セレクターXMLなどを使用してスリーステートトグルボタンを実行する方法、またはおそらく私が考えていなかった別の方法はありますか?私はこれを行う方法がかなり途方に暮れています。

19
Melde

確かに、3つのエントリを持つ背景として使用するセレクターを定義できます。問題は、セレクターに使用できるボタン属性です。 AとBの2つのブール属性を設定し、A、B、およびデフォルトの観点からセレクターを定義できます。 (A && BはAを満たすので、より適切にはA、!A && B、および!A &&!Bと考えることができます。)既存の属性(選択、フォーカスなど)をオーバーロードするか、よりエレガントに、説明されているレシピを使用して独自のカスタム属性を定義します このスレッドで

10
Ted Hopp

マルチステートトグルボタンを実装しました。ソースコードは ここ です。

これはそれがどのように見えるかです:

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

これを実現するためにカスタム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;
    }

}
11
davidforneron

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"
         />
...
2
Aetherna