多状态切换button

在我一直在努力的应用程序中,我想有一个多态(在我的情况下,三个)切换button,而不是ToggleButton提供的两个。 我试着开始自己的扩展Button ,遵循CompoundButton来源,但老实说阅读其来源有点压倒一切。

有没有办法做一个三态切换button只使用一个select器XML或东西,或者可能是另一种我没有想到的方法? 我不知道如何做到这一点。

Solutions Collecting From Web of "多状态切换button"

你当然可以定义一个select器作为背景,有三个条目。 问题是你可以使用什么button属性的select器。 你可以有两个布尔属性,比如说A和B,用A,B和default来定义select器。 (A && B将满足A,所以更恰当的可以被认为是A,!A && B,!A &&!B)。您可以超载现有的属性(select,聚焦等),或者更优雅地,使用此主题中描述的配方定义您自己的自定义属性。

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

这是它的样子:

在这里输入图像说明

使用它非常简单:

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

你可以创build一个自定义的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; } } 

为什么不使用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" /> ...