多状态切换按钮

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

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

  • 如何在Android中看到ProgressBar时禁用用户交互?
  • 如何显示3秒的视图,然后隐藏它?
  • Android:如何重绘图形元素?
  • 以编程方式添加的RadioButtons拒绝服从LayoutParams加权
  • 利用Android 4.4 KitKat中的半透明状态栏
  • 如何使Action Bar SearchView填充整个操作栏?
  • 像素和缩放像素之间的关系是什么
  • 水平“选项卡”在视图之间滚动
  • 您当然可以定义一个选择器用作具有三个条目的背景。 问题是您可以将哪些按钮属性用于选择器。 您可以有两个布尔属性,例如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和样式无线电?

        ...