¿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 ()?
- Utilice el botón de conmutación estilo Android 4.0
- Botón de selección de Android MenuItem
- Establecer ToggleButton para reproducir el sonido predeterminado cuando se hace clic en?
- Android Toggle Button en ActionBar
- ¿Cómo puedo obtener el texto dinámico ToggleButton en android?
- Colocación de etiquetas de texto ToggleButton para estado activado y desactivado
- Botón de alternancia en el cajón de navegación
- Android - ¿Espacio entre TextView y Togglebutton?
- Botón de encendido / apagado en las preferencias y barra de acción - Ice Cream Sandwich Estilo
- Cómo eliminar el relleno del botón de conmutación en Android
- Cómo cambiar el color de texto de un Android ToogleButton en el cambio de estado?
- Android: Crear un botón de alternancia con imagen y sin texto
- Cómo cambiar el estado ToggleButton mediante programación?
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.)
- Android: Cómo implementar viewpager y vistas en un único archivo xml
- Obtener la URL de descarga para el vídeo de YouTube (Android / Java)