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