android.widget.Switch: ¿activar/desactivar el detector de eventos?

6 minutos de lectura

avatar de usuario
johan

Me gustaría implementar un botón de cambio, android.widget.Switch (disponible desde API v.14).

<Switch
    android:id="@+id/switch1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Switch" />

Pero no estoy seguro de cómo agregar un detector de eventos para el botón. ¿Debería ser un oyente “onClick”? ¿Y cómo sabría si está “activado” o no?

  • OnClick a través de XML realmente funciona, pero solo para “clics” en el botón, no para “diapositivas”.

    – m02ph3u5

    20 de enero de 2015 a las 12:59

avatar de usuario
Sam

Cambiar hereda CompoundButtonatributos de , por lo que recomendaría el OnCheckedChangeListener

mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // do something, the isChecked will be
        // true if the switch is in the On position
    }
});

  • @Johan No hay problema. No sé ustedes, pero me gustaría que lo llamaran OnCheckChangedListener, similar a OnItemSelectedListener, ya que On-SustantivoVerbo-El oyente es una convención de nomenclatura establecida.

    – sam

    1 de julio de 2012 a las 0:10


  • Pero cuando enciendes un fragmento, por ejemplo, esa cosa siempre se dispara cada vez que vuelves a visitar el fragmento si configuras el interruptor en Encendido.

    – Lendl Leyba

    23 de septiembre de 2016 a las 8:04

  • @Sam ¿Qué pasa si quiero cambiar el interruptor al estado ON u OFF usando el método setChcked() y no quiero ejecutar el método onCheckedChanged? Pero cuando el usuario vuelve a tocar el método de cambio onCheckedChanged se ejecuta … ¿Hay alguna forma de hacer esto?

    – Deepak Kumar

    18 de enero de 2019 a las 10:26

  • Los botones tienen OnCLicklos interruptores no tienen OnChange! ¡Equipo de Google bien diseñado!

    – Vasilis

    1 de junio de 2019 a las 12:26

  • @KZoNE Lo que hice aquí fue usar el detector de clics para cambiar el estado y pasar el cambio al método (en mi caso, llamada a la API) y luego usé el método setChecked() para cambiar el estado (como en onFailure/onError en la llamada a la API) . Espero que ayude.

    – Deepak Kumar

    21 de febrero de 2020 a las 9:09

avatar de usuario
Shridutt Kothari

Use el siguiente fragmento para agregar un interruptor a su diseño a través de XML:

<Switch
     android:id="@+id/on_off_switch"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textOff="OFF"
     android:textOn="ON"/>

Luego, en el método onCreate de su Actividad, obtenga una referencia a su Switch y configure su OnCheckedChangeListener:

Switch onOffSwitch = (Switch)  findViewById(R.id.on_off_switch); 
onOffSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    Log.v("Switch State=", ""+isChecked);
}       

});

  • Esta es una respuesta más clara que le brinda el diseño y el código detrás para que coincida.

    – Cenizas a las cenizas

    19 de abril de 2015 a las 5:29

  • ¿Cómo administrar múltiples switchescompat en el único oyente? Por favor sugiera una respuesta para eso

    –Anand Savjani

    9 de noviembre de 2016 a las 17:08

avatar de usuario
Faheel

Para aquellos que usan Kotlin, puede configurar un oyente para un interruptor (en este caso, con la ID mySwitch) como sigue:

    mySwitch.setOnCheckedChangeListener { _, isChecked ->
         // do whatever you need to do when the switch is toggled here
    }

isChecked es verdadero si el interruptor está activado (ON) y falso en caso contrario.

Defina su diseño XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.neoecosystem.samplex.SwitchActivity">

    <Switch
        android:id="@+id/myswitch"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content" />

</RelativeLayout> 

Luego crea una Actividad

public class SwitchActivity extends ActionBarActivity implements CompoundButton.OnCheckedChangeListener {

    Switch mySwitch = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_switch);


        mySwitch = (Switch) findViewById(R.id.myswitch);
        mySwitch.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // do something when check is selected
        } else {
            //do something when unchecked
        }
    }

    ****
}

======== Para por debajo de API 14 usar SwitchCompat =========

XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.neoecosystem.samplex.SwitchActivity">

    <android.support.v7.widget.SwitchCompat
        android:id="@+id/myswitch"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content" />

</RelativeLayout>

Actividad

public class SwitchActivity extends ActionBarActivity implements CompoundButton.OnCheckedChangeListener {

    SwitchCompat mySwitch = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_switch);


        mySwitch = (SwitchCompat) findViewById(R.id.myswitch);
        mySwitch.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // do something when checked is selected
        } else {
            //do something when unchecked
        }
    }
   *****
}

En Kotlin:

        switch_button.setOnCheckedChangeListener { buttonView, isChecked ->
        if (isChecked) {
            // The switch enabled
            text_view.text = "Switch on"

        } else {
            // The switch disabled
            text_view.text = "Switch off"

        }
    }

  • esto está bien para el cambio de interruptor, pero ¿cómo se obtiene el estado actual?

    – Skovie

    8 ago 2020 a las 21:30

  • @Skovie Estado booleano = switch_button.isChecked()

    – Shadros

    8 de agosto de 2020 a las 23:28

El diseño del widget Switch es algo como esto.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <Switch
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="20dp"
        android:gravity="right"
        android:text="All"
        android:textStyle="bold"
        android:textColor="@color/black"
        android:textSize="20dp"
        android:id="@+id/list_toggle" />
</LinearLayout>

En la clase Actividad, puede codificar de dos maneras. Depende del uso que puedas codificar.

Primera Vía

public class ActivityClass extends Activity implements CompoundButton.OnCheckedChangeListener {
Switch list_toggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.return_vehicle);

    list_toggle=(Switch)findViewById(R.id.list_toggle);
    list_toggle.setOnCheckedChangeListener(this);
    }
}

public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
    if(isChecked) {
        list_toggle.setText("Only Today's");  //To change the text near to switch
        Log.d("You are :", "Checked");
    }
    else {
        list_toggle.setText("All List");   //To change the text near to switch
        Log.d("You are :", " Not Checked");
    }
}

segunda forma

public class ActivityClass extends Activity {
Switch list_toggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.return_vehicle);

    list_toggle=(Switch)findViewById(R.id.list_toggle);
    list_toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
       @Override
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          if(isChecked) {
             list_toggle.setText("Only Today's");  //To change the text near to switch
             Log.d("You are :", "Checked");
          }
          else {
             list_toggle.setText("All List");  //To change the text near to switch
             Log.d("You are :", " Not Checked");
          }
       }       
     });
   }
}

  • esto está bien para el cambio de interruptor, pero ¿cómo se obtiene el estado actual?

    – Skovie

    8 ago 2020 a las 21:30

  • @Skovie Estado booleano = switch_button.isChecked()

    – Shadros

    8 de agosto de 2020 a las 23:28

avatar de usuario
alí hasan

Puede usar DataBinding y ViewModel para el evento Switch Checked Change

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
                name="viewModel"
                type="com.example.ui.ViewModel" />
    </data>
    <Switch
            android:id="@+id/on_off_switch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onCheckedChanged="@{(button, on) -> viewModel.onCheckedChange(on)}"
     />

  • android.widget.Switch no tiene el atributo onCheckedChanged. Obtendrá un error: AAPT: error: atributo android:onCheckedChanged no encontrado.

    – Vendido

    3 abr 2020 a las 13:50

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad