Intereting Posts
Android View исчезает, когда выходит за пределы родителя Android-игра с двумя игроками, которую нужно играть в Интернете Андроид, фон, список слоев и масштабируемый элемент растрового изображения GetExternalFilesDir (null) возвращает null Как отключить диалог «сохранить пароль» в Android WebView? Как установить переменную среды в Android Studio, прежде чем она запустит мою структуру градиента DatePicker показывает неправильное значение месяца Задание зависимостей проекта Android (в Eclipse) Пытаться снять выделение с помощью getChildAt () Android Studio Gradle: ошибка: выполнение не выполнено для задачи: app: processDebugGoogleServices. > Отсутствует соответствующий клиент для пакета Как скрыть softkeyboad, когда активность начинается в Android? Проблема с SDK для Android при использовании calabash-android Различные разрешения поддержки android Перевернутый массив байтов предварительного просмотра камеры Как получить идентификатор самого верхнего действия?

Как узнать, изменилось ли пользователь состояние кнопки переключения?

У меня есть десять кнопок переключения. Я хочу сохранить состояние пяти из этих кнопок при нажатии кнопки «Домой». Но я хочу сохранить его только в том случае, если пользователь внес изменения в любое из состояний кнопок. Есть ли способ узнать об изменении состояний без использования setOnClickListener ()?

Solutions Collecting From Web of "Как узнать, изменилось ли пользователь состояние кнопки переключения?"

Я сделал следующее, это не так приятно, но он работает:

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

И я делаю следующее, если я хочу изменить кнопку программно, не выполняя прослушиватель изменений:

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

Используйте класс CompoundButton.OnCheckedChangeListener .

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

EDIT : Если вы хотите использовать один прослушиватель:

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

Но есть много способов реализовать это на самом деле. Таким образом, вы можете составить другой метод, который лучше всего подходит вам.

Существует простой способ узнать, нажимает ли пользователь CompoundButton (CheckBox, Switch, RadioButton, ToggleButton) следующее:

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

Использовать пользовательский вид

 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

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

Теперь идея состоит в том, чтобы вызвать метод setCheckedProgrammatically в коде. SetChecked вызывается Android, когда пользователи меняют состояние кнопки compund

Обратите внимание, что я использую переключатель, который расширяет функциональную кнопку, вы можете использовать в основном тот же код на любом другом (флажок, …)

Сначала проверьте эту ссылку http://developer.android.com/resources/tutorials/views/hello-formstuff.html#ToggleButton

Простой onChangeListener будет делать:

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

Используйте View.OnTouchListener, чтобы прослушать обнаружение взаимодействия с пользователем. Я реализовал это в своем классе адаптера.

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

}

Я бы рекомендовал это решение: https://stackoverflow.com/a/9130007/2708288

Вкратце, используйте « boolean CheckBox # isShown () », чтобы определить, в каком случае он возвращает false, даже если вы изменяете состояние проверки внутри onStart () или onResume () действия. (Я не тестировал сценарий фрагмента.)