Android-changer par programme l'état d'un commutateur sans déclencher oncheckchanged écouteur


je suis à la recherche d'une méthode de modification programmatique de l'état D'un widget Android Switch en utilisant switch.setChecked(true); sans déclencher OnCheckedChangedlistener.

Ma première pensée a été de l'échanger contre un OnClickListener mais comme cela enregistre uniquement les clics et que vous pouvez non seulement cliquer mais aussi faire glisser un interrupteur, ce N'est pas vraiment adapté comme si l'utilisateur devait faire glisser le commutateur de off à on alors le commutateur ne ferait rien car l'utilisateur ne clique pas...

Si quelqu'un a une solution ou un travail intelligent pour cela, ce serait génial

21
demandé sur Paul Alexander 2014-09-03 14:32:23

6 réponses

Eh bien, juste avant de faire des choses dans le code avec le commutateur, vous pouvez simplement annuler l'enregistrement de l'écouteur, puis faire tout ce dont vous avez besoin, et à nouveau enregistrer l'écouteur.

19
répondu smnpl 2014-09-03 10:34:47

Définissez l'écouteur sur null avant d'appeler setCheck () function, et Activez Après cela, par exemple:

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

Référence : Change la valeur de la case à cocher sans déclencher onCheckChanged

20
répondu Mahmoud Ibrahim 2016-07-18 11:16:34

J'ai une solution et ça marche bien à ma fin. J'ai ajouté setOnTouchListener et setOnCheckedChangeListener sur mon contrôle de commutateur, et ajouté le code suivant pour résoudre mon problème.

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

De cette façon, setOnCheckedChangeListener n'est appelé que lorsque la vérification changée se produit par une intervention humaine par glisser, par clic, par toucher.

N'oubliez pas non plus d'ajouter votre balise de chaîne valide ( non null ) lorsque vous essayez de changer l'état de contrôle du commutateur. comme :

 mMySwitch.setTag("TAG");
 mMySwitch.setChecked(true);
13
répondu Chetan Bhoyar 2015-09-29 06:32:03

Un moyen réutilisable consiste à écrire un commutateur personnalisé ou SwitchCompat et à remplacer 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
répondu hyb1996 2017-09-18 04:40:31

Développer la réponse de Mahmoud

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

`

-1
répondu Ismail Iqbal 2017-03-20 05:59:07

Ajoutez simplement ceci à votre code:

activity.recreate();
-4
répondu Giovannini Barbosa 2017-08-18 16:25:48