多状态切换按钮

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

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

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

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

这就是它的样子:

在此处输入图像描述

它很容易使用它:

  

在您的活动中:

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

您可以创建自定义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和样式无线电?

    ...