如何在Android的内部主题中使用getsStyledAttributes(int )

所以我查了一下,发现android.R.styleable不再是SDK的一部分,尽pipe它仍然logging在这里: http : //developer.android.com/reference/android/R.styleable.html
如果清楚地logging了替代scheme,这并不是一个问题。 例如,AOSP日历应用程序仍然使用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(); 

那么如何得到backgroundDimAmount而不从android.R.styleable.Theme得到int[]呢? 为了使它与SDK一起工作,我必须坚持进入obtainStyledAttributes(int [])吗?

Solutions Collecting From Web of "如何在Android的内部主题中使用getsStyledAttributes(int )"

CustomView API演示显示如何检索样式属性。 视图的代码在这里:

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

用于检索文本,颜色和大小的可修改arrays在此处的章节中定义:

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

您可以使用它来定义要作为一个组检索的任何属性列表,其中包含您自己的和由平台定义的属性列表。

至于文档中的这些东西,围绕样式化数组有很多java文档,这使得它们在文档中很有用,所以它们一直存在。 然而,随着数组的变化,如添加新的属性,常量的值可能会改变,所以平台的不能在SDK中(请不要使用任何技巧来尝试访问它们)。 无论如何,应该没有必要使用平台的,因为它们都是为了实现框架的一部分而实现的,而且在这里创build自己的代码是很简单的。

在这个例子中,他们没有提到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(); } 

将obtainStyledAttributes更改为c.obtainStyledAttributes应该可行

在具有其自己的默认样式的自定义视图中拉出标准属性(背景)的示例。 在这个例子中,自定义视图PasswordGrid扩展了GridLayout 。 我为PasswordGrid指定了一个样式,它使用标准的android属性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(); } } } 

这是我的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> 

这似乎是SDK中的一个错误。 我已经提出了一个问题 ,你可能希望明星,以获得更新。

作为解决方法,您可以使用reflection来访问该字段:

 Class clazz=Class.forName("android.R$styleable"); int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);