Android-программное изменение состояния коммутатора без запуска прослушивателя OnCheckChanged
Я ищу метод программного изменения состояния виджета Android Switch с помощью switch.setChecked(true);
без срабатывания OnCheckedChangedlistener
.
моей первой мыслью было заменить на OnClickListener
но так как это только регистрирует щелчки, и вы можете не только щелкнуть, но и сдвинуть переключатель, то это не совсем подходит для цели, как если бы пользователь должен был сдвинуть переключатель от выключения до включения, то переключатель на самом деле ничего не будет делать, поскольку пользователь не нажатие...
если у кого - то есть решение или умная работа для этого, это было бы потрясающе
6 ответов
Ну, перед тем, как делать что-то в коде с переключателем, вы можете просто отменить регистрацию слушателя, затем сделать все, что вам нужно, и снова зарегистрировать слушателя.
установить слушателя null перед вызовом setCheck() и включить это после этого, например, следующее:
switch.setOnCheckedChangeListener (null);
switch.setChecked(true);
switch.setOnCheckedChangeListener (this);
ссылка: изменение значения флажка без запуска onCheckChanged
у меня есть одно решение, и оно отлично работает на моем конце. Я добавил 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 вызывается только тогда, когда check changed происходит при вмешательстве человека путем перетаскивания, щелчка, прикосновения.
также не забудьте добавить допустимый строковый тег (не null ) при попытке изменить статус проверки управления коммутатором. например:
mMySwitch.setTag("TAG");
mMySwitch.setChecked(true);
многоразовый способ-написать пользовательский переключатель или 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.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);
}
`