studio programacion móviles desarrollo desarrollar curso con botones aprende aplicaciones android user-interface button togglebutton

android - programacion - Botón de alternancia de múltiples estados



manual de programacion android pdf (4)

¿Por qué no utilizar RadioGroup y radios de estilo dentro?

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

En la aplicación en la que he estado trabajando, me gustaría tener un botón de activación múltiple (en mi caso, tres), en lugar de los dos que proporciona ToggleButton . He intentado iniciar mi propio Button que extiende a Button , siguiendo la fuente CompoundButton , pero honestamente, leer sobre su fuente se ha vuelto un poco abrumador.

¿Hay una manera de hacer un botón de alternar de tres estados usando solo un xml selector o algo así, o tal vez otro método que no haya pensado? Estoy bastante en una pérdida de cómo hacer esto.


Ciertamente, puede definir un selector para usar como fondo que tiene tres entradas. La pregunta es qué atributos de botón puede usar para el selector. Puede tener dos atributos booleanos, por ejemplo, A y B, y definir el selector en términos de A, B y predeterminado. (A && B satisfarán a A, por lo que, más apropiadamente, podrían considerarse como A,! A && B, y! A &&! B). Puede sobrecargar los atributos existentes (seleccionados, enfocados, etc.) o, más elegantemente, define tus propios atributos personalizados usando la receta descrita en este hilo .


Implementé un botón de activación de estado múltiple, el código fuente está here

Así es como se ve:

Y es bastante fácil de usar:

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

En tu actividad:

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


Puedes crear un ImageButton personalizado para lograr esto, necesitas 3 imágenes diferentes en este caso. También puede agregar más estados si lo desea.

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