0

Jusqu'à présent, je ne peux que modifier la couleur du texte de résumé/titre d'une préférence avec setSpan() sur le texte, mais je ne pouvais pas trouver quelque chose qui peut changer la couleur du commutateur dans un SwitchPreference, j'ai considéré plusieurs plans, y compris définir une mise en page personnalisée, ou définir un adaptateur personnalisé pour la préférence, mais je n'ai pas une idée claire de la façon de les atteindre encore, donc, votre aide sera grandement appréciée . PS: J'ai considéré simplement définir une mise en page personnalisée, mais cela ne fonctionnera pas dans mon cas car je dois changer la couleur d'un SwitchPreference lorsque l'application est en cours d'exécution, et les utilisateurs peuvent définir une couleur personnalisée pour les commutateurs, les thèmes ne fonctionneront donc pas dans ce cas.Android - Comment changer dynamiquement la couleur du pouce/piste d'un commutateur SwitchPreference

+0

Envoyer cette https://stackoverflow.com/questions/21235829/custom-switchpreference-in-android – Gautam

+0

Gautam, j'ai déjà essayé switchpreference personnalisé, le problème est que je ne sais pas comment définir la couleur du pouce/piste du commutateur dans mon code Java. – jackz314

Répondre

0

OK, je l'ai trouvé la solution par moi-même:

Créer une classe SwitchPreference personnalisée, puis appliquez cela à tous les widgets SwitchPreference que vous avez obtenu, la classe ressemble à ceci:

class ColorSwitchPreference extends SwitchPreference { 
    Switch aSwitch; 
    SharedPreferences sharedPreferences; 

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

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

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

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


    @Override 
    protected void onBindView(View view) { 
     super.onBindView(view); 
     aSwitch = findSwitchInChildViews((ViewGroup) view); 
     if (aSwitch!=null) { 
      //do change color here 
      changeColor(aSwitch.isChecked(),aSwitch.isEnabled()); 
      aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        changeColor(isChecked, aSwitch.isEnabled()); 
       } 
      }); 
     } 
    } 

    private void changeColor(boolean checked, boolean enabled){ 
     try { 
      sharedPreferences = getContext().getSharedPreferences("settings_data",MODE_PRIVATE); 
      //apply the colors here 
      int thumbCheckedColor = sharedPreferences.getInt("theme_color_key",Color.parseColor("#3F51B5")); 
      int thumbUncheckedColor = Color.parseColor("#ECECEC"); 
      int trackCheckedColor = sharedPreferences.getInt("theme_color_key",Color.parseColor("#3F51B5")); 
      int trackUncheckedColor = Color.parseColor("#B9B9B9"); 
      if(enabled){ 
       aSwitch.getThumbDrawable().setColorFilter(checked ? thumbCheckedColor : thumbUncheckedColor, PorterDuff.Mode.MULTIPLY); 
       aSwitch.getTrackDrawable().setColorFilter(checked ? trackCheckedColor : trackUncheckedColor, PorterDuff.Mode.MULTIPLY); 
      }else { 
       aSwitch.getThumbDrawable().setColorFilter(Color.parseColor("#B9B9B9"), PorterDuff.Mode.MULTIPLY); 
       aSwitch.getTrackDrawable().setColorFilter(Color.parseColor("#E9E9E9"), PorterDuff.Mode.MULTIPLY); 
      } 
     }catch (NullPointerException e){ 
      e.printStackTrace(); 
     } 
    } 

    private Switch findSwitchInChildViews(ViewGroup view) {// find the Switch widget in the SwitchPreference 
     for (int i=0;i<view.getChildCount();i++) { 
      View thisChildview = view.getChildAt(i); 
      if (thisChildview instanceof Switch) { 
       return (Switch)thisChildview; 
      } 
      else if (thisChildview instanceof ViewGroup) { 
       Switch theSwitch = findSwitchInChildViews((ViewGroup) thisChildview); 
       if (theSwitch!=null) return theSwitch; 
      } 
     } 
     return null; 
    } 
} 

Fondamentalement, vous utilisez findSwitchInChildViews() pour obtenir le widget Switch dans SwitchPreference, puis modifiez la couleur à partir de là.

C'est tout! C'est en fait une approche assez simple, mais je n'y avais jamais pensé auparavant, j'espère que ce post pourra aider quelqu'un à l'avenir à éviter ma lutte.

(PS: Je suis le code pour trouver Passer du here, en changeant la couleur de commutation de here, merci)