Diese Frage wird an vielen Stellen auf viele verschiedene Arten gestellt. Ich antwortete , es ursprünglich hier , aber ich fühle es auch in diesem Thread relevant ist (da ich am Ende hier gelandet bin, als ich nach einer Antwort gesucht habe).
Es gibt keine einzeilige Lösung für dieses Problem, aber dies hat für meinen Anwendungsfall funktioniert. Das Problem ist, dass der Konstruktor 'View (context, attrs, defStyle)' nicht auf einen tatsächlichen Stil verweist, sondern ein Attribut benötigt. Wir werden:
- Definieren Sie ein Attribut
- Erstellen Sie einen Stil, den Sie verwenden möchten
- Wenden Sie einen Stil für dieses Attribut auf unser Thema an
- Erstellen Sie mit diesem Attribut neue Instanzen unserer Ansicht
Definieren Sie in 'res / values / attrs.xml' ein neues Attribut:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="customTextViewStyle" format="reference"/>
...
</resources>
In res / values / styles.xml 'werde ich den Stil erstellen, den ich in meiner benutzerdefinierten Textansicht verwenden möchte
<style name="CustomTextView">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:paddingLeft">14dp</item>
</style>
Ändern Sie in 'res / values / theme.xml' oder 'res / values / styles.xml' das Thema für Ihre Anwendung / Aktivität und fügen Sie den folgenden Stil hinzu:
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light">
<item name="@attr/customTextViewStyle">@style/CustomTextView</item>
</style>
...
</resources>
Schließlich können Sie in Ihrer benutzerdefinierten Textansicht jetzt den Konstruktor mit dem Attribut verwenden, und er erhält Ihren Stil
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context, null, R.attr.customTextView);
}
}
Es ist erwähnenswert, dass ich customTextView wiederholt in verschiedenen Varianten und an verschiedenen Stellen verwendet habe, aber es ist in keiner Weise erforderlich, dass der Name der Ansicht mit dem Stil oder dem Attribut oder irgendetwas übereinstimmt. Diese Technik sollte auch mit jeder benutzerdefinierten Ansicht funktionieren, nicht nur mit TextViews.