Multi-State Toggle Button

后端 未结 5 1138
别那么骄傲
别那么骄傲 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 03:43

    I implemented a multi-state toggle button, the source code is here

    This is how it looks:

    enter image description here

    And it's quite easy to use it:

    <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" />
    

    In your activity:

    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);
        }
    });
    
    0 讨论(0)
  • 2020-12-03 03:46

    Why not use RadioGroup and style radios inside?

     <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"
             />
    ...
    
    0 讨论(0)
  • 2020-12-03 03:47

    Chip is a very good native option.

     <com.google.android.material.chip.ChipGroup
          android:id="@+id/chip_group"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          app:layout_constraintTop_toTopOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:singleSelection="true">
    
          <com.google.android.material.chip.Chip
               android:id="@+id/first_chip"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:gravity="center"
               android:text="Todo"
               android:textAppearance="?android:attr/textAppearance"
               android:textColor="@color/black"
               android:checkable="true"
               style="@style/Widget.MaterialComponents.Chip.Choice"
               app:chipBackgroundColor="@color/colorAccent"/>
    
               <!-- Second Chip -->
               <!-- Third Chip -->
    
       </com.google.android.material.chip.ChipGroup>
    

    binding.chipGroup.setOnCheckedChangeListener { chipGroup, i -> 
        when (i) {
            binding.firstChip -> {
                binding.firstChip.setChipBackgroundColorResource(R.color.colorAccent)
            }
            else -> {} 
        }
    }
    binding.firstChip.isChecked = true  //default
    

    GL

    Source

    0 讨论(0)
  • 2020-12-03 04:03

    You can certainly define a selector to use as a background that has three entries. The question is what button attributes you can use for the selector. You can have two boolean attributes, say A and B, and define the selector in terms of A, B, and default. (A && B will satisfy A, so more properly they could be thought of as A, !A && B, and !A && !B.) You can overload existing attributes (selected, focused, etc.) or, more elegantly, define your own custom attributes using the recipe described in this thread.

    0 讨论(0)
  • 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;
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题