2010-01-24 12 views
17

J'ai donc regardé autour de moi et j'ai découvert que android.R.styleable ne fait plus partie du SDK même s'il est encore documenté here.Comment utiliser getStyledAttributes (int []) avec des thèmes internes d'Android

Ce ne serait pas vraiment un problème si l'alternative était clairement documentée. Par exemple, le calendrier PSBA App utilise toujours le 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(); 

Alors, comment peut-on obtenir le backgroundDimAmount sans obtenir le int[] de android.R.styleable.Theme?

Que dois-je coller dans obtainStyledAttributes(int []) afin de le faire fonctionner avec le SDK?

+0

Le même problème existe avec la Galerie tutoriel, j'ai vu des solutions de contournement qui rendent le travail tutoriel mais aucune explication quant à la façon dont le tutoriel devrait être fixé en utilisant uniquement des classes de SDK et ne pas ajouter votre propre xml avec le styleable dedans. Le tutoriel est à http://developer.android.com/resources/tutorials/views/hello-gallery.html le code est dans le "ImageAdapter (Context c)" Constructeur – AGrunewald

+0

Voici une discussion similaire http://stackoverflow.com/q/8793183/1307690 – Lemberg

Répondre

12

La démo de l'API CustomView montre comment récupérer les attributs de style. Le code de la vue est ici:

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

Le tableau styleable utilisé pour récupérer le texte, la couleur et la taille est définie dans la section <declare-styleable> ici:

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

Vous pouvez utiliser <declare-styleable> pour définir toute liste d'attributs que vous souhaitez récupérer en tant que groupe, contenant à la fois les vôtres et ceux définis par la plate-forme. Dans la mesure où ces éléments sont dans la documentation, il y a beaucoup de doc java autour des tableaux stylables qui les rendent utiles dans la documentation, ils ont donc été laissés là. Cependant, à mesure que les tableaux changent, tels que de nouveaux attributs ajoutés, les valeurs des constantes peuvent changer, de sorte que les plates-formes ne peuvent pas être dans le SDK (et n'utilisez pas de trucs pour y accéder). De toute façon, il ne devrait pas être nécessaire d'utiliser ceux de la plateforme, car ils sont chacun là juste pour la mise en œuvre des parties du framework, et il est trivial de créer les vôtres comme montré ici.

+2

Merci pour l'info, aide un peu. Pour autant que je comprends on crée, le Xml Styleable avec par exemple. un attribut étant "android: backgroundDimAmount" qui permet à l'application de récupérer les données correctes. En ce qui concerne les choses étant dans le SDK. Je comprends qu'il y a beaucoup de précieuse documentation, mais une explication de la classe dans le document SDK et non du SDK dans la référence de l'API pourrait éclaircir les choses pour les développeurs à l'avenir, car il existe encore des didacticiels mal: http://developer.android.com/intl/zh-CN/resources/tutorials/views/hello-gallery.html – AGrunewald

+0

@hackbod Le premier lien de la réponse est obsolète. – Pang

4

Cela semble être un bogue dans le SDK. J'ai déposé un issue dessus, que vous voudrez peut-être mettre en vedette pour recevoir des mises à jour.

En tant que worksaround, vous pouvez utiliser la réflexion pour accéder au champ:

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

Eh bien, selon Dianne Hackborn, il a été volontairement retiré du SDK en le cachant. Voici la discussion à ce sujet 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 Y a-t-il un moyen de le faire correctement sans utiliser de réflexion? – AGrunewald

+0

Si elle est intentionnellement partie, vous ne devriez pas l'utiliser. Les applications internes (par exemple, Calendrier) peuvent l'utiliser, car elles ne sont pas limitées à l'utilisation du SDK. Au-delà, je n'ai aucun conseil, désolé. J'ai mis à jour le problème pour essayer d'obtenir des réponses. – CommonsWare

+2

Merci, je suis d'accord je ne devrais pas l'utiliser mais alors il devrait y avoir une alternative. Et le tutoriel de vue de la galerie aurait dû être mis à jour il y a longtemps, puisqu'il montre toujours ce code. – AGrunewald

13

Dans l'exemple, ils ont laissé la référence au contexte « c »:

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

Changer obtainStyledAttributes à c.obtainStyledAttributes devraient travailler

+2

Je sais que cela arrive en retard, mais c'est la bonne réponse !!! –

7

Exemple de tirant attribut standard (arrière-plan) dans un vue personnalisée qui a son propre style par défaut. Dans cet exemple, la vue personnalisée PasswordGrid s'étend GridLayout. J'ai spécifié un style pour PasswordGrid qui définit une image de fond en utilisant l'attribut android standard android: fond.

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(); 
      } 
     } 
    } 

Voici une partie de mes styles.fichier xml:

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