Question

Je l'ai regardé et trouvé que android.R.styleable ne fait plus partie du SDK, même si elle est encore documenté ici .

Ce ne serait pas vraiment un problème si elle a été clairement documentée quelle est l'alternative. 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 tenir en obtainStyledAttributes(int []) afin de le faire fonctionner avec le SDK?

Était-ce utile?

La solution

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 / valeurs / attrs.xml # L24

Vous pouvez utiliser <declare-styleable> pour définir une liste d'attributs que vous souhaitez récupérer en tant que groupe, contenant à la fois vos propres et celles définies par la plate-forme.

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

Autres conseils

Dans l'exemple, ils ont quitté la référence au contexte « 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;
}

Modification obtainStyledAttributes à c.obtainStyledAttributes devrait fonctionner

Exemple de tirant 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 étend GridLayout . J'ai spécifié un style pour PasswordGrid qui définit une image d'arrière-plan en utilisant l'attribut standard Android android. Arrière-plan

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 mon fichier styles.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>

Cela semble être un bug dans le SDK. J'ai déposé un à ce sujet, que vous voudrez peut-être à l'étoile afin de recevoir des mises à jour à ce sujet.

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top