Mir gefällt der Vorschlag von pospi. Warum nicht gehen Sie alle aus jeder Verwendung der "Tag"-Eigenschaft einer Ansicht (die Sie in XML angeben können - "Android:tag"), um alle zusätzlichen Styling, die Sie nicht in XML tun können angeben. Ich mag JSON, also würde ich einen JSON-String verwenden, um einen Schlüssel/Wert-Satz anzugeben. Diese Klasse macht die Arbeit - rufen Sie einfach Style.setContentView(this, [resource id])
in Ihrer Tätigkeit.
public class Style {
/**
* Style a single view.
*/
public static void apply(View v) {
if (v.getTag() != null) {
try {
JSONObject json = new JSONObject((String)v.getTag());
if (json.has("typeface") && v instanceof TextView) {
((TextView)v).setTypeface(Typeface.createFromAsset(v.getContext().getAssets(),
json.getString("typeface")));
}
}
catch (JSONException e) {
// Some views have a tag without it being explicitly set!
}
}
}
/**
* Style the passed view hierarchy.
*/
public static View applyTree(View v) {
apply(v);
if (v instanceof ViewGroup) {
ViewGroup g = (ViewGroup)v;
for (int i = 0; i < g.getChildCount(); i++) {
applyTree(g.getChildAt(i));
}
}
return v;
}
/**
* Inflate, style, and set the content view for the passed activity.
*/
public static void setContentView(Activity activity, int resource) {
activity.setContentView(applyTree(activity.getLayoutInflater().inflate(resource, null)));
}
}
Natürlich müssen Sie mehr als nur die Schriftart verarbeiten, damit sich die Verwendung von JSON lohnt.
Ein Vorteil der Eigenschaft "tag" besteht darin, dass Sie sie auf einen Basisstil setzen können, den Sie als Thema verwenden, und sie somit automatisch auf alle Ihre Ansichten anwenden können. EDITAR: Dies führt unter Android 4.0.3 zu einem Absturz beim Aufblasen. Sie können weiterhin einen Stil verwenden und ihn auf einzelne Textansichten anwenden.
Eine Sache, die Sie im Code sehen werden - einige Ansichten haben ein Tag, ohne dass eines explizit gesetzt ist - bizarrerweise ist es die Zeichenfolge '' - was laut Google-Übersetzung "cut" auf Griechisch bedeutet! Was zur Hölle...?