この質問は多くの場所でさまざまな方法で行われます。私はもともとここで答えましたが、このスレッドにも関連があると感じています(答えを探していたときにここにたどり着いたためです)。
この問題に対する1行の解決策はありませんが、これは私の使用例ではうまくいきました。問題は、 'View(context、attrs、defStyle)'コンストラクターが実際のスタイルを参照せず、属性を必要とすることです。だから、私たちは:
- 属性を定義する
- 使いたいスタイルを作る
- テーマにその属性のスタイルを適用します
- その属性でビューの新しいインスタンスを作成します
'res / values / attrs.xml'で、新しい属性を定義します。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="customTextViewStyle" format="reference"/>
...
</resources>
res / values / styles.xml 'で、カスタムTextViewで使用するスタイルを作成します
<style name="CustomTextView">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:paddingLeft">14dp</item>
</style>
「res / values / themes.xml」または「res / values / styles.xml」で、アプリケーション/アクティビティのテーマを変更し、次のスタイルを追加します。
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light">
<item name="@attr/customTextViewStyle">@style/CustomTextView</item>
</style>
...
</resources>
最後に、カスタムTextViewで、コンストラクターを属性と共に使用すると、スタイルを受け取ります。
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context, null, R.attr.customTextView);
}
}
さまざまなバリエーションや場所でcustomTextViewを繰り返し使用したことは注目に値しますが、ビューの名前がスタイルや属性などと一致する必要はまったくありません。また、この手法は、TextViewsだけでなく、あらゆるカスタムビューで機能するはずです。