Come faccio a utilizzare getStyledAttributes (int ) con i themes interni di Android

Così ho guardato intorno e ho scoperto che android.R.styleable non è più parte del SDK anche se è ancora documentato qui: http://developer.android.com/reference/android/R.styleable.html
Questo non sarebbe davvero un problema se si documentasse chiaramente quale alternativa fosse. Ad esempio, l'applicazione AOSP Calendar utilizza ancora 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 ottiene il backgroundDimAmount senza get l' int[] da android.R.styleable.Theme ? Cosa devo attaccare a obtainStyledAttributes(int []) per far funzionare l'SDK?

  • Android - Formatta il timestamp in ListView con l'adattatore cursore
  • zoom pizzico android
  • Android ViewPager con ScrollViews con ViewPagers all'interno di ScrollViews
  • Quadri RESTful per Android, iOS ...?
  • android: camera.getParameters () blocca app
  • Dove si trova cordova-2.7.0.jar?
  • Modificare l'icona freccia nel menu del cassetto?
  • Ombra di goccia di Android in vista
  • come mascherare le chiamate perse per leggere in android?
  • Imansible aggiornare a plugin di Android Studio gradle 1.4
  • Come posso integrare Paypal agli utenti di pagamento quando si fa clic su un button?
  • Stampa Bluetooth su Android
  • 4 Solutions collect form web for “Come faccio a utilizzare getStyledAttributes (int ) con i themes interni di Android”

    La demo API CustomView mostra come recuperare gli attributi in stile. Il codice della vista è qui:

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

    L'arrays standardabile utilizzato per recuperare il text, il colore e la dimensione è definito nella sezione qui:

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

    È ansible utilizzare per definire qualsiasi elenco di attributi che si desidera recuperare come gruppo, che contiene sia i propri che quelli definiti dalla piattaforma.

    Per quanto queste cose siano nella documentazione, ci sono molti doc di Java intorno agli arrays stilabili che li rendono utili per avere nella documentazione, quindi sono stati lasciati. Tuttavia, come modificano gli arrays, come i nuovi attributi che vengono aggiunti, i valori delle costanti possono cambiare, in modo che le piattaforms non possano essere presenti nell'HDK (e non utilizzare trucchi per cercare di accedervi). Non bisogna comunque usare le piattaforms, perché sono ognuna di esse solo per l'implementazione di parti del framework, ed è banale creare il proprio come mostrato qui.

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

    La modifica di getStyledAttributes a c.obtainStyledAttributes dovrebbe funzionare

    Esempio di estrarre l'attributo standard (background) in una visualizzazione personalizzata che ha il proprio stile predefinito. In questo esempio la vista personalizzata PasswordGrid estende GridLayout . Ho specificato uno stile per PasswordGrid che imposta un'image di background utilizzando l'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(); } } } 

    Ecco una 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 nell' SDK. Ho presentato un argomento su di esso, che desideri starti per ricevere aggiornamenti su di esso.

    Come una sola soluzione, puoi utilizzare la riflessione per accedere al field:

     Class clazz=Class.forName("android.R$styleable"); int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.