How to find out if the user has changed the state of the toggle button?

I have ten toggle buttons. I want to save the state of five of these buttons when I click the Home button. But I want to save it only if the user has made changes to any of the button states. Is there a way to learn about state changes without using setOnClickListener ()?

+12
android android-togglebutton
Aug 25 '11 at 8:32
source share
7 answers

I did the following, it is not so nice, but it works:

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

and I do the following if I want to change a button programmatically without executing a change listener:

 ttsButton.setOnCheckedChangeListener(null); ttsButton.setChecked(false); ttsButton.setOnCheckedChangeListener(toggleButtonChangeListener); 
+29
Jan 03 '13 at 21:10
source share

Use the CompoundButton.OnCheckedChangeListener class.

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

EDIT . If you want to use one listener:

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

But there are many ways to actually implement this. Thus, you can make up another method that suits you better than this.

+15
Aug 25 '11 at 8:41
source share

There is an easy way to find out if a CompoundButton user (CheckBox, Switch, RadioButton, ToggleButton) clicks the following:

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

+7
Jan 10 '17 at 16:58
source share

Use custom view

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

XML example

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

Now the idea is to call the setCheckedProgrammatically method in code. setChecked is called by Android when users change the state of the compund button

Please note that I use a switch that extends the function button, you can use basically the same code for any other (checkbox, ...)

+1
Apr 15 '15 at 21:04
source share

First check this link http://developer.android.com/resources/tutorials/views/hello-formstuff.html#ToggleButton

A simple onChangeListener will do:

  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); } } } }; } 
0
Aug 25 2018-11-11T00: 00Z
source share

Use View.OnTouchListener to listen for user interaction detection. I implemented this in my adapter class.

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

}

0
Nov 26 '15 at 5:46
source share

I would recommend this solution: stack overflow

In short, use " boolean CheckBox # isShown () " to determine in which case it returns false, even if you change the check state inside the onStart () or onResume () actions. (I have not tested the fragment script.)

0
Jul 17 '16 at 1:00
source share