Ответ 1
Ну, прежде чем делать что-то в коде с помощью коммутатора, вы можете просто отменить регистрацию слушателя, затем сделать все, что вам нужно, и снова зарегистрировать слушателя.
Я ищу способ программного изменения состояния виджета Android Switch с помощью switch.setChecked(true);
без запуска OnCheckedChangedlistener
.
Моя первая мысль заключалась в том, чтобы поменять его на OnClickListener
но поскольку это только регистрирует клики, и вы можете не только щелкнуть, но и сместить переключатель, но он не подходит для цели, как если бы пользователь должен был сдвинуть переключатель с выкл. то коммутатор фактически ничего не сделает, поскольку пользователь не нажимает...
Если бы у кого-то было решение или умная работа для этого, это было бы потрясающе
Ну, прежде чем делать что-то в коде с помощью коммутатора, вы можете просто отменить регистрацию слушателя, затем сделать все, что вам нужно, и снова зарегистрировать слушателя.
Установите для слушателя значение null перед вызовом функции setCheck() и включите его после этого, например, так:
switch.setOnCheckedChangeListener (null);
switch.setChecked(true);
switch.setOnCheckedChangeListener (this);
У меня есть одно решение, и он отлично работает в моем конце. Я добавил 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);
Напишите пользовательский 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;
}
}
Каждая кнопка CompoundButton (кнопка двух состояний - вкл/выкл) имеет нажатое состояние, которое истинно, только когда пользователь нажимает на представление.
Просто добавьте проверку в ваш слушатель перед запуском фактической логики:
if(compoundButton.isPressed()) {
// continue with your listener
}
Таким образом, изменение проверенного значения программным способом не вызовет нежелательный код.
От ответа @krisDrOid.
Разработка ответа Махмуда
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);
}
'
Просто добавьте это в свой код:
activity.recreate();