tecla simple pared mixto luz interruptor instalar enchufe como colocar cambiar arreglar apagadores java android onclicklistener oncheckedchanged android-switch

java - simple - como instalar un interruptor de pared



Android: cambia programáticamente el estado de un interruptor sin activar el servicio de escucha OnCheckChanged (6)


Estoy buscando un método para cambiar mediante programación el estado de un widget de Android Switch usando switch.setChecked(true); sin activar OnCheckedChangedlistener .

Mi primer pensamiento fue intercambiarlo por un OnClickListener pero como esto solo registra los clics y no solo puede hacer clic, sino también deslizar un interruptor, no es realmente adecuado para el propósito como si el usuario deslizara el interruptor de apagado a encendido entonces el Switch no haría nada ya que el usuario no está haciendo clic ...

Si alguien tiene una solución o un trabajo inteligente para esto, sería increíble


Bueno, justo antes de hacer cosas en el código con el interruptor, puede anular el registro del Oyente, luego hacer lo que sea necesario y, de nuevo, registrar al oyente.


Elaborando la respuesta de Mahmoud.

CompoundButton.OnCheckedChangeListener switchListener; @Override protected void onCreate(Bundle savedInstanceState) { switchListener = new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { //Implement on check change } }; switch.setOnCheckedChangeListener (switchListener); //When you want to trigger the checked of switch do the following switch.setOnCheckedChangeListener (null); switch.setChecked(true); switch.setOnCheckedChangeListener (switchListener); }

`


Establezca el escucha en nulo antes de llamar a la función setCheck () , y habilítelo después de eso, como lo siguiente:

switch.setOnCheckedChangeListener (null); switch.setChecked(true); switch.setOnCheckedChangeListener (this);

Referencia : cambiar el valor de la casilla de verificación sin activar onCheckChanged


Solo agrega esto a tu código:

activity.recreate();


Tengo una solución y está funcionando bien en mi extremo. He agregado setOnTouchListener y setOnCheckedChangeListener en mi control de conmutador, y he agregado el siguiente código para resolver mi problema.

// set tag by default. mMySwitch.setTag("TAG"); // Add OnCheckedChangeListener. mMySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (mMySwitch.getTag() != null) { mMySwitch.setTag(null); return; } // Do your stuff here. } }); // Add Touch listener. mMySwitch.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mMySwitch.setTag(null); return false; } });

De esta manera, se llama a setOnCheckedChangeListener solo cuando el cambio cambiado se realiza mediante la intervención humana al arrastrar, al hacer clic, al tocar.

Tampoco se olvidó de agregar su etiqueta de cadena válida (no nula) cuando intenta cambiar el estado de verificación del control del interruptor. me gusta :

mMySwitch.setTag("TAG"); mMySwitch.setChecked(true);


Una forma reutilizable es escribir un Switch personalizado o SwitchCompat y anular el setOnCheckedListener.

public class SwitchCompat extends android.support.v7.widget.SwitchCompat { private boolean mIgnoreCheckedChange = false; public SwitchCompat(Context context) { super(context); } public SwitchCompat(Context context, AttributeSet attrs) { super(context, attrs); } public SwitchCompat(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void setOnCheckedChangeListener(final OnCheckedChangeListener listener) { super.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (mIgnoreCheckedChange) { return; } listener.onCheckedChanged(buttonView, isChecked); } }); } public void setChecked(boolean checked, boolean notify) { mIgnoreCheckedChange = !notify; setChecked(checked); mIgnoreCheckedChange = false; } }