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?

War es hilfreich?

Lösung

Die Custom API Demo zeigt, wie gestylt Attribute abzurufen. Der Code für die Ansicht ist hier:

https://github.com/android/platform_development/blob/master/samples/ApiDemos/src/com/example/android/apis/view/LabelView.java

Die styleable Array verwendet, um den Text, Farbe abgerufen werden, und die Größe ist in der <declare-styleable> Abschnitt definiert sich hier:

https: // Github .com / android / platform_development / Blob / Master / samples / ApiDemos / res / Werte / attrs.xml # L24

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top