Domanda

Così ho guardato intorno e ha scoperto che android.R.styleable non fa più parte del SDK anche se è ancora documentato qui .

Non sarebbe davvero un problema se è stato chiaramente documentato ciò che l'alternativa è. Ad esempio, il calendario AOSP App è ancora utilizzando il 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();

Quindi, come si potrebbe ottenere il backgroundDimAmount senza ottenere il int[] da android.R.styleable.Theme?

Che cosa devo attaccare in obtainStyledAttributes(int []) al fine di farlo funzionare con l'SDK?

È stato utile?

Soluzione

Il CustomView API demo mostra come recuperare gli attributi stile. Il codice per la vista è qui:

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

L'array styleable utilizzato per recuperare il testo, il colore e la dimensione è definita nella sezione <declare-styleable> qui:

https: // GitHub .com / android / platform_development / blob / master / campioni / ApiDemos / res / valori / attrs.xml # L24

È possibile utilizzare <declare-styleable> per definire qualsiasi elenco di attributi che si desidera recuperare come un gruppo, contenente sia le proprie e quelle definite dalla piattaforma.

Per quanto riguarda queste cose sono nella documentazione, c'è un sacco di java doc intorno alle matrici styleable che li rende utile avere nella documentazione, in modo che sono stati lasciati lì. Tuttavia, come gli array cambiano, come ad esempio nuovi attributi vengono aggiunti, i valori delle costanti possono cambiare, per cui valgono le piattaforme non possono essere nel SDK (e prega di non utilizzare trucchi per tentare di accedervi). Non ci dovrebbe essere alcun bisogno di usare quelle di piattaforma in ogni caso, perché ciascuno di essi è lì solo per la realizzazione di parti del quadro, ed è banale per creare il proprio come mostrato qui.

Altri suggerimenti

Nell'esempio, hanno lasciato fuori il riferimento al contesto '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;
}

La modifica obtainStyledAttributes a c.obtainStyledAttributes dovrebbe funzionare

Esempio di tirare fuori attributo standard (sfondo) in una visualizzazione personalizzata, che ha il suo stile di default. In questo esempio la visualizzazione personalizzata PasswordGrid si estende GridLayout . Ho specificato uno stile per PasswordGrid che definisce un'immagine di sfondo utilizzando l'attributo standard di Android Android:. Sfondo

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

Qui è parte del mio file 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>

Questo sembra essere un bug nel SDK. Ho presentato una problema su di esso, che si può desiderare a stella in modo da ricevere gli aggiornamenti su di esso.

Come worksaround, è possibile utilizzare la reflection per accedere al campo:

Class clazz=Class.forName("android.R$styleable");
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top