O terceiro construtor é muito mais complicado. Deixe-me dar um exemplo.
O SwitchCompactpacote Support-v7 suporta thumbTinte trackTintatribui desde a versão 24, enquanto a versão 23 não os suporta. Agora você deseja apoiá-los na versão 23 e como fará para conseguir isso?
Assumimos usar personalizado Ver SupportedSwitchCompactestende 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();
}
É um estilo de código tradicional. Observe que passamos 0 para o terceiro parâmetro aqui . Ao executar o código, você getThumbDrawable()sempre retornará nulo o quão estranho é, porque o método getThumbDrawable()é o método de sua superclasse SwitchCompact.
Se você passar R.attr.switchStylepara o terceiro parâmetro, tudo vai bem.
O terceiro parâmetro é um atributo simples. O atributo aponta para um recurso de estilo. No caso acima, o sistema encontrará o switchStyleatributo no tema atual, felizmente, o sistema o encontrará.
Em frameworks/base/core/res/res/values/themes.xml, você verá:
<style name="Theme">
<item name="switchStyle">@style/Widget.CompoundButton.Switch</item>
</style>