2010-01-24 7 views
17

So habe ich mich umgesehen und festgestellt, dass nicht mehr Teil des SDK ist, obwohl es noch dokumentiert ist here.Wie verwende ich erhaltenStyledAttributes (int []) mit internen Designs von Android

Das wäre nicht wirklich ein Problem, wenn es eindeutig dokumentiert wäre, was die Alternative ist. Zum Beispiel App das AOSP Kalender 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 backgroundDimAmount bekommen, ohne die int[] von android.R.styleable.Theme zu bekommen?

Was muss ich in obtainStyledAttributes(int []) stecken, damit es mit dem SDK funktioniert?

+0

Das gleiche Problem mit der Galerie-Ansicht Tutorial existiert, habe ich Abhilfen gesehen, dass das Tutorial Arbeit machen, aber keine Erklärung, wie das Tutorial würde nur mit SDK-Klassen werden muß, festgelegt und nicht geben Sie Ihre eigenen Xml mit dem Styleable drin. Das Tutorial ist unter http://developer.android.com/resources/tutorials/views/hello-gallery.html der Code ist in der "ImageAdapter (Context c)" Constructor – AGrunewald

+0

Hier ist eine ähnliche Diskussion http://StackOverflow.com/q/8793183/1307690 – Lemberg

Antwort

12

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 hier:

https://github.com/android/platform_development/blob/master/samples/ApiDemos/res/values/attrs.xml#L24

Sie verwenden können <declare-styleable>, um eine Liste von Attributen zu definieren, die Sie als Gruppe abrufen möchten und die sowohl Ihre eigenen als auch die von der Plattform definierten Attribute enthält.

Soweit diese Dinge in der Dokumentation ist, gibt es eine Menge von Java-Doc um die styleable Arrays, die sie nützlich in der Dokumentation haben, so dass sie dort gelassen wurden. Wenn sich die Arrays jedoch ändern, z. B. wenn neue Attribute hinzugefügt werden, können sich die Werte der Konstanten ändern, sodass die Plattform-Elemente nicht im SDK enthalten sein können (und bitte keine Tricks verwenden, um auf sie zuzugreifen). Es sollte sowieso nicht notwendig sein, die Plattform zu verwenden, da sie jeweils nur für die Implementierung von Teilen des Frameworks zur Verfügung stehen, und es ist trivial, Ihre eigenen zu erstellen, wie hier gezeigt.

+2

Danke für die Info, hilft ziemlich viel. Soweit ich das verstehe erstellt man das Xml Styleable mit zB. Ein Attribut ist "android: backgroundDimAmount", mit dem die App die richtigen Daten abrufen kann. In Bezug auf die Dinge im SDK. Ich verstehe, dass es eine Menge wertvoller Dokumentation gibt, aber eine Erklärung, warum die Klasse im SDK-Dokument und nicht im eigentlichen SDK direkt in der API-Referenz enthalten ist, könnte Entwickler in Zukunft aufklären, da es noch Tutorien gibt, die das tun falsch: http://developer.android.com/intl/zh-CN/resources/tutorials/views/hello-gallery.html – AGrunewald

+0

@hackbod Der erste Link in der Antwort ist veraltet. – Pang

4

Dies scheint ein Fehler im SDK zu sein. Ich habe eine issue darauf abgelegt, die Sie möglicherweise Stern, um Updates auf es erhalten möchten.

Als worksaround, können Sie mithilfe von Reflektion auf das Feld zuzugreifen:

Class clazz=Class.forName("android.R$styleable"); 
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz); 
+0

Nun, nach Dianne Hackborn wurde es absichtlich aus dem SDK entfernt, indem es versteckt wurde. Hier ist die Diskussion darüber http://groups.google.com/group/android-developers/tree/browse_frm/thread/6554c6688f3ca6d9/8d018aa3f5c2beb9?rnum=1&_done=%2Fgroup%2Fandroid-developers%2Fbrowse_frm%2Fthread%2F6554c6688f3ca6d9% 3Ftvc% 3D1% 26 # doc_72f29c1df624bbed Also gibt es eine Möglichkeit, es richtig zu tun, ohne Reflexion zu verwenden? – AGrunewald

+0

Wenn es absichtlich weg ist, sollten Sie es nicht benutzen. Interne Anwendungen (z. B. Kalender) können sie verwenden, da sie nicht auf die Verwendung des SDK beschränkt sind. Darüber hinaus habe ich keinen Rat, tut mir leid. Ich habe das Problem aktualisiert, um einige Antworten zu erhalten. – CommonsWare

+2

Danke, ja ich stimme zu Ich sollte es nicht benutzen aber dann sollte es eine Alternative geben. Und das Gallery View Tutorial sollte vor langer Zeit aktualisiert worden sein, da es immer noch diesen Code anzeigt. – AGrunewald

13

Im Beispiel ließen sie die Referenz auf den Kontext 'c' out:

public ImageAdapter(Context c) { 
    mContext = c; 
    TypedArray a = c.obtainStyledAttributes(R.styleable.GalleryPrototype); 
    mGalleryItemBackground = a.getResourceId(
      R.styleable.GalleryPrototype_android_galleryItemBackground, 0); 
    a.recycle(); 
} 

Ändern obtainStyledAttributes zu c.obtainStyledAttributes dem Herausziehen Standardattribut (Hintergrund) in einem

+2

Ich weiß, das kommt spät, aber das ist die richtige Antwort !!! –

7

Beispiel arbeiten sollte benutzerdefinierte Ansicht, die einen eigenen Standardstil hat. In diesem Beispiel wird die benutzerdefinierte Ansicht PasswordGrid erweitert GridLayout. Ich habe einen Stil für PasswordGrid angegeben, der ein Hintergrundbild mit dem Standard-Android-Attribut android: background festlegt.

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 Stile.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> 
Verwandte Themen