Android - программно изменяет состояние переключателя без запуска OnCheckChanged прослушивателя


Я ищу способ программного изменения состояния виджета Android Switch с помощью switch.setChecked(true); без запуска OnCheckedChangedlistener.

Моя первая мысль заключалась в том, чтобы поменять его на OnClickListener но поскольку это только регистрирует клики, и вы можете не только щелкнуть, но и сместить переключатель, но он не подходит для цели, как если бы пользователь должен был сдвинуть переключатель с выкл. то коммутатор фактически ничего не сделает, поскольку пользователь не нажимает...

Если бы у кого-то было решение или умная работа для этого, это было бы потрясающе

Ответ 1

Ну, прежде чем делать что-то в коде с помощью коммутатора, вы можете просто отменить регистрацию слушателя, затем сделать все, что вам нужно, и снова зарегистрировать слушателя.

Ответ 2

Установите для слушателя значение null перед вызовом функции setCheck() и включите его после этого, например, так:

switch.setOnCheckedChangeListener (null);
switch.setChecked(true);
switch.setOnCheckedChangeListener (this);

Ссылка: Изменить значение флажка, не вызывая onCheckChanged

Ответ 3

У меня есть одно решение, и он отлично работает в моем конце. Я добавил setOnTouchListener и setOnCheckedChangeListener в свой элемент управления коммутатором и добавил следующий код для решения моей проблемы.

    // set tag by default.
    mMySwitch.setTag("TAG");

    // Add OnCheckedChangeListener.
    mMySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
         @Override
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (mMySwitch.getTag() != null) {
                 mMySwitch.setTag(null);
                 return;
                }

          // Do your stuff here.
        }
    });

    // Add Touch listener.
    mMySwitch.setOnTouchListener(new View.OnTouchListener() {
         @Override
         public boolean onTouch(View v, MotionEvent event) {
            mMySwitch.setTag(null);
            return false;
         }
    });

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

Также не забудьте добавить свой действительный строковый тег (не null), когда вы пытаетесь изменить статус проверки управления коммутатором. как:

 mMySwitch.setTag("TAG");
 mMySwitch.setChecked(true);

Ответ 4

Напишите пользовательский Switch или SwitchCompat и переопределите setOnCheckedListener.

public class SwitchCompat extends android.support.v7.widget.SwitchCompat {
private boolean mIgnoreCheckedChange = false;

public SwitchCompat(Context context) {
    super(context);
}

public SwitchCompat(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public SwitchCompat(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}


@Override
public void setOnCheckedChangeListener(final OnCheckedChangeListener listener) {
    super.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (mIgnoreCheckedChange) {
                return;
            }
            listener.onCheckedChanged(buttonView, isChecked);
        }
    });
}

public void setChecked(boolean checked, boolean notify) {
    mIgnoreCheckedChange = !notify;
    setChecked(checked);
    mIgnoreCheckedChange = false;
}

}

Ответ 5

Каждая кнопка CompoundButton (кнопка двух состояний - вкл/выкл) имеет нажатое состояние, которое истинно, только когда пользователь нажимает на представление.

Просто добавьте проверку в ваш слушатель перед запуском фактической логики:

if(compoundButton.isPressed()) {
    // continue with your listener
}

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

От ответа @krisDrOid.

Ответ 6

Разработка ответа Махмуда

CompoundButton.OnCheckedChangeListener switchListener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    switchListener = new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                //Implement on check change
            }
        }; 
      switch.setOnCheckedChangeListener (switchListener);

      //When you want to trigger the checked of switch do the following
      switch.setOnCheckedChangeListener (null);
      switch.setChecked(true);
      switch.setOnCheckedChangeListener (switchListener);
     }

'

Ответ 7

Просто добавьте это в свой код:

activity.recreate();