Le troisième constructeur est beaucoup plus compliqué, laissez-moi vous donner un exemple.
Support-v7 SwitchCompactprend en charge thumbTintet trackTintattribut depuis la version 24 alors que la version 23 ne les prend pas en charge.Maintenant, vous voulez les prendre en charge dans la version 23 et comment ferez-vous pour y parvenir?
Nous supposons que vous utilisez des SupportedSwitchCompactextensions de vue personnalisées SwitchCompact.
public SupportedSwitchCompat(Context context) {
this(context, null);
}
public SupportedSwitchCompat(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SupportedSwitchCompat(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init(){
mThumbDrawable = getThumbDrawable();
mTrackDrawable = getTrackDrawable();
applyTint();
}
C'est un style de code traditionnel. Notez que nous passons 0 au troisième paramètre ici . Lorsque vous exécutez le code, vous trouverez getThumbDrawable()toujours return null à quel point il est étrange car la méthode getThumbDrawable()est la méthode de sa super classe SwitchCompact.
Si vous passez R.attr.switchStyleau troisième paramètre, tout se passe bien, alors pourquoi?
Le troisième paramètre est un attribut simple. L'attribut pointe vers une ressource de style. Dans le cas ci-dessus, le système trouvera l' switchStyleattribut dans le thème courant, heureusement que le système le trouve.
Dans frameworks/base/core/res/res/values/themes.xml, vous verrez:
<style name="Theme">
<item name="switchStyle">@style/Widget.CompoundButton.Switch</item>
</style>