Comment utiliser obtainStyledAttributes (int []) avec les thèmes internes D'Android

donc j'ai regardé autour de moi et j'ai découvert que android.R.styleable ne fait plus partie du SDK même si elle est encore documentée ici .

ce ne serait pas vraiment un problème s'il était clairement documenté ce qu'est l'alternative. Par exemple, L'application Calendrier de L'AOSP 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 obtenir le backgroundDimAmount sans obtenir le int[] de android.R.styleable.Theme ?

Qu'est-ce que je dois coller dans obtainStyledAttributes(int []) pour le faire fonctionner avec le SDK?

18
demandé sur Rahul Sharma 2010-01-24 16:21:15

4 réponses

la démo de L'API CustomView montre comment récupérer les attributs stylés. Le code pour 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éfini 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 n'importe quelle liste d'attributs que vous voulez récupérer en tant que groupe, contenant à la fois vos propres et ceux définis par la plate-forme.

en ce qui concerne ces choses étant dans la documentation, Il ya beaucoup de java doc autour des tableaux styleable qui les rend utiles à avoir dans la documentation, de sorte qu'ils ont été laissés là. Cependant, au fur et à mesure que les tableaux changent, comme de nouveaux attributs ajoutés, les valeurs des constantes peuvent changer, de sorte que les constantes de la plate-forme ne peuvent pas être dans le SDK (et s'il vous plaît ne pas utiliser de trucs pour essayer d'y accéder). Il ne devrait pas être nécessaire d'utiliser les plates-formes de toute façon, parce qu'elles sont chacune là juste pour la mise en œuvre de parties du cadre, et il est trivial de créer votre propre comme montré ici.

12
répondu hackbod 2018-01-10 09:24:04

Dans l'exemple, ils ont quitté 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();
}

Changing obtainStyledAttributes to C. les contributionsobtenues devraient fonctionner

14
répondu kpasgma 2010-09-21 21:23:59

exemple d'extraction d'un attribut standard (arrière-plan) dans une 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:background .

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>
7
répondu LanDenLabs 2014-08-17 01:57:18

cela semble être un bug dans le SDK. J'ai déposé un problème , que vous pouvez étoile pour recevoir des mises à jour sur elle.

comme solution de contournement, 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);
4
répondu CommonsWare 2010-01-24 14:37:06