¿Cómo saber si el usuario ha cambiado el estado del botón de alternancia?

Tengo diez botones de conmutación. Quiero guardar el estado de cinco de esos botones al hacer clic en el botón de inicio. Pero quiero guardarlo sólo si el usuario ha realizado un cambio en cualquiera de los botones del estado. ¿Hay alguna manera de conocer el cambio en los estados sin usar setOnClickListener ()?

He hecho lo siguiente, no es tan agradable, pero funciona:

ttsButton = (ToggleButton) findViewById(R.id.solution_ttsbutton); ttsButton.setOnCheckedChangeListener(toggleButtonChangeListener); ... // gets called, if the button state changes final CompoundButton.OnCheckedChangeListener toggleButtonChangeListener = new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // The user changed the button, do something } }; 

Y hago lo siguiente, si quiero cambiar el botón programáticamente sin ejecutar el oyente de cambio:

 ttsButton.setOnCheckedChangeListener(null); ttsButton.setChecked(false); ttsButton.setOnCheckedChangeListener(toggleButtonChangeListener); 

Utilice la clase CompoundButton.OnCheckedChangeListener .

 ToggleButton button = /* ... */; button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // Save the state here } }); 

EDIT : Si desea utilizar un solo oyente:

 CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { String key = null; switch(buttonView.getId()) { case R.id.button1: key = "key1"; break; case R.id.button2: key = "key2"; break; default: return; } // Save the state here using key } }); ToggleButton button1 = /* ... */; button1.setOnCheckedChangeListener(listener); ToggleButton button2 = /* ... */; button2.setOnCheckedChangeListener(listener); 

Pero hay muchas maneras de implementar esto realmente. Así que usted puede hacer otro método que se adapte a su necesidad mejor que éste.

Hay una manera simple de saber si el usuario hace clic en el CompoundButton (CheckBox, Switch, RadioButton, ToggleButton), utilice lo siguiente:

new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { if (compoundButton.isPressed()) { // do something related to user click/tap } else { // do something related to programmatically state changes (checked/unchecked) } } }

Usar una vista personalizada

 import android.content.Context; import android.util.AttributeSet; import android.widget.Switch; public class CustomSwitch extends Switch { private OnCheckedChangeListener mListener; public CustomSwitch(Context context) { super(context); } public CustomSwitch(Context context, AttributeSet attrs) { super(context, attrs); } public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { // Do not call supper method mListener = listener; } @Override public void setChecked(boolean checked) { super.setChecked(checked); if (mListener != null) { mListener.onCheckedChanged(this, checked); } } public void setCheckedProgrammatically(boolean checked) { // You can call super method, it doesn't have a listener... he he :) super.setChecked(checked); } } 

Ejemplo de uso de XML

 <com.your.package.CustomSwitch android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

Ahora la idea es llamar al método setCheckedProgrammatically en código. SetChecked es llamado por Android cuando los usuarios cambian el estado del botón compund

Tenga en cuenta que estoy utilizando un switch, que amplía el botón compund, puede utilizar básicamente el mismo código en cualquier otro (checkbox, …)

Primero verifica este enlace http://developer.android.com/resources/tutorials/views/hello-formstuff.html#ToggleButton

Un simple onChangeListener hará:

  public class TestProjectActivity extends Activity { ToggleButton one; ToggleButton two; ToggleButton three; ToggleButton four; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); one = (ToggleButton) findViewById(R.id.toggleButton1); two = (ToggleButton) findViewById(R.id.toggleButton2); three = (ToggleButton) findViewById(R.id.toggleButton3); four = (ToggleButton) findViewById(R.id.toggleButton4); one.setOnCheckedChangeListener(changeChecker); two.setOnCheckedChangeListener(changeChecker); three.setOnCheckedChangeListener(changeChecker); four.setOnCheckedChangeListener(changeChecker); } OnCheckedChangeListener changeChecker = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked){ if (buttonView == one) { two.setChecked(false); three.setChecked(false); four.setChecked(false); } if (buttonView == two) { one.setChecked(false); three.setChecked(false); four.setChecked(false); } if (buttonView == three) { two.setChecked(false); one.setChecked(false); four.setChecked(false); } if (buttonView == four) { two.setChecked(false); three.setChecked(false); one.setChecked(false); } } } }; } 

Utilice View.OnTouchListener para escuchar para detectar las interacciones del usuario. He implementado esto en mi clase de adaptador.

 public class MyRecyclerViewAdapter extends RecyclerView.Adapter<ViewHolder> implements AccountUtils.OnAccountStateChange ,View.OnTouchListener{ // variable to store whether screen id pressed or not public static boolean pressed=false; //If User touches the screen //MotionEvent.ACTION_DOWN is triggred //and when user lifts his hand (takes away from screen) //MotionEvent.ACTION_UP is triggred // Here you should the change the value of pressed accordingly @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: pressed = true;// Screen Touched break; case MotionEvent.ACTION_UP: pressed = false;// Screen break; } return false; } static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { final SwitchCompat btnToggle; public ViewHolder(final View itemView) { super(itemView); btnToggle = (SwitchCompat) itemView.findViewById(R.id.btn_toggle); btnToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // IF the value in Var pressed is true // only then trigger this event if (pressed) { // YOUR METHOD GOES HERE Toast.makeText(context, "Checked Changed", Toast.LENGTH_SHORT).show(); } } }); } } 

}

Recomendaría esta solución: https://stackoverflow.com/a/9130007/2708288

En pocas palabras, use " Boolean CheckBox # isShown () " para determinar qué caso, devuelve false incluso si modifica el estado check dentro de onStart () o onResume () de una actividad. (No he probado el escenario Fragmento.)

  • Botón de alternancia de varios estados
  • Android: Especifique dos imágenes diferentes para el togglebutton mediante XML
  • Botón de Toggle de Android tamaño personalizado / relleno / espaciado
  • ToggleButton en ListView, el valor cambia automáticamente al desplazarse
  • ¿Es posible crear un ToggleButton sin texto?
  • Pantalla personalizada de botón de conmutación de Android
  • El evento del botón de conmutación no funciona en varios dispositivos
  • Android: AmazingListView encabezado fijado es intocable
  • Cómo realizar vinculación de datos de dos vías con un ToggleButton?
  • cómo guardar togglebutton estado utilizando preferencias compartidas
  • Agregar el widget Switch a ActionBar y responder al evento de cambio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.