Wie verwende ich obtainStyledAttributes (int []) mit internen Themen von Android
-
22-09-2019 - |
Frage
So habe ich sehe mich um und fand heraus, dass android.R.styleable
ist nicht mehr Teil des SDK, obwohl es noch dokumentiert hier .
Das wäre nicht wirklich ein Problem sein, wenn es klar dokumentiert wurde, was die Alternative ist. Zum Beispiel App das AOSP Kalender ist immer noch mit dem android.R.styleable
// Get the dim amount from the theme
TypedArray a = obtainStyledAttributes(com.android.internal.R.styleable.Theme);
lp.dimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
a.recycle();
Wie würde man die erhalten backgroundDimAmount
, ohne die int[]
von android.R.styleable.Theme
zu bekommen?
Was muss ich Stick in obtainStyledAttributes(int [])
zu machen, um es mit dem SDK arbeiten?
Lösung
Die Custom API Demo zeigt, wie gestylt Attribute abzurufen. Der Code für die Ansicht ist hier:
Die styleable Array verwendet, um den Text, Farbe abgerufen werden, und die Größe ist in der <declare-styleable>
Abschnitt definiert sich hier:
Sie können <declare-styleable>
verwenden eine beliebige Liste von Attributen zu definieren, dass Sie als Gruppe abrufen möchten, sowohl Ihre eigenen und diejenigen enthält, die durch die Plattform definiert.
Was diese Dinge in der Dokumentation zu sein, gibt es eine Menge von Java-doc um die styleable Arrays, das sie nützlich macht in der Dokumentation zu haben, so dass sie dort gelassen wurden. Da jedoch die Arrays zu ändern, wie neue Attribute hinzugefügt werden, können die Werte der Konstanten ändern, so dass die Plattform diejenigen nicht im SDK sein können (und bitte verwenden Sie keine Tricks, um den Zugang zu ihnen zu versuchen). Es soll nicht nötig sein, um die Plattform diejenigen trotzdem zu verwenden, da sie jeweils dort nur für die Durchführung von Teilen des Rahmens sind, und es ist trivial eigene zu erstellen, wie hier gezeigt.
Andere Tipps
In dem Beispiel, ließen sie den Verweis auf den Kontext aus 'c':
public ImageAdapter(Context c) {
TypedArray a = c.obtainStyledAttributes(R.styleable.GalleryPrototype);
mGalleryItemBackground = a.getResourceId(
R.styleable.GalleryPrototype_android_galleryItemBackground, 0);
a.recycle();
return mGalleryItemBackground;
}
Ändern obtainStyledAttributes zu c.obtainStyledAttributes sollte funktionieren
Beispiel für das Herausziehen Standard-Attributs (Hintergrund) in einer benutzerdefinierten Ansicht, die einen eigenen Standardstil hat. In diesem Beispiel wird die benutzerdefinierte Ansicht PasswordGrid erweitert Gridlayout . Ich angegeben, einen Stil für PasswordGrid, die ein Hintergrundbild setzt den Standard Android-Attribut Android. Hintergrund
public class PasswordGrid extends GridLayout {
public PasswordGrid(Context context) {
super(context);
init(context, null, 0);
}
public PasswordGrid(Context context, AttributeSet attrs) {
super(context, attrs, R.attr.passwordGridStyle);
init(context, attrs, 0);
}
public PasswordGrid(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
if (!isInEditMode()) {
TypedArray stdAttrs = context.obtainStyledAttributes(attrs,
new int[] { android.R.attr.background }, // attribute[s] to access
defStyle,
R.style.PasswordGridStyle); // Style to access
// or use any style available in the android.R.style file, such as
// android.R.style.Theme_Holo_Light
if (stdAttrs != null) {
Drawable bgDrawable = stdAttrs.getDrawable(0);
if (bgDrawable != null)
this.setBackground(bgDrawable);
stdAttrs.recycle();
}
}
}
Hier ist ein Teil meiner styles.xml-Datei:
<declare-styleable name="passwordGrid">
<attr name="drawOn" format="color|reference" />
<attr name="drawOff" format="color|reference" />
<attr name="pathWidth" format="integer" />
<attr name="pathAlpha" format="integer" />
<attr name="pathColor" format="color" />
</declare-styleable>
<style name="PasswordGridStyle" parent="@android:style/Widget.GridView" >
<!-- Style custom attributes. -->
<item name="drawOff">@drawable/ic_more</item>
<item name="drawOn">@drawable/ic_menu_cut</item>
<item name="pathWidth">31</item>
<item name="pathAlpha">129</item>
<item name="pathColor">@color/green</item>
<!-- Style standard attributes -->
<item name="android:background">@drawable/pattern_bg</item>
</style>
Dies scheint ein Fehler im SDK zu sein. Ich habe eine Ausgabe darauf abgelegt, die Sie sich interessieren Sterne auf, um zu erhalten Updates auf sie.
Als worksaround können Sie Reflexion den Zugriff auf das Feld verwenden:
Class clazz=Class.forName("android.R$styleable");
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);