Come posso utilizzare obtainStyledAttributes (int []) con i temi interni di Android
-
22-09-2019 - |
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?
Soluzione
Il CustomView API demo mostra come recuperare gli attributi stile. Il codice per la vista è qui:
L'array styleable utilizzato per recuperare il testo, il colore e la dimensione è definita nella sezione <declare-styleable>
qui:
È 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);