Multi-State Toggle Button

后端 未结 5 1164
别那么骄傲
别那么骄傲 2020-12-03 03:10

In the app I\'ve been working on, I would like to have a multiple-state (in my case, three) toggle button, instead of the two that ToggleButton provides. I\'ve

5条回答
  •  日久生厌
    2020-12-03 04:08

    You can create a custom ImageButton to achieve this, you need 3 different images in this case. You can also add more states if you want.

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

提交回复
热议问题