21

所以我环顾四周,发现它android.R.styleable不再是 SDK 的一部分,尽管它仍然记录在此处

如果清楚地记录了替代方案是什么,那将不是真正的问题。例如,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没有得到int[]from的情况下得到 theandroid.R.styleable.Theme呢?

obtainStyledAttributes(int [])为了使它与 SDK 一起工作,我必须坚持什么?

4

4 回答 4

16

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

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

用于检索文本、颜色和大小的样式数组在<declare-styleable>此处的部分中定义:

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

您可以使用<declare-styleable>来定义要作为组检索的任何属性列表,其中包含您自己的属性和平台定义的属性。

就文档中的这些内容而言,可样式数组周围有很多 java doc,这使得它们在文档中很有用,因此它们被保留在那里。但是随着数组的变化,比如添加新的属性,常量的值会发生变化,所以平台的不能在SDK中(请不要使用任何技巧来尝试访问它们)。无论如何都不需要使用平台的,因为它们每个都只是为了实现框架的一部分,创建你自己的是微不足道的,如此处所示。

于 2010-01-25T06:11:49.373 回答
15

在示例中,他们省略了对上下文“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;
}

将 gainStyledAttributes 更改为 c.obtainStyledAttributes 应该可以

于 2010-09-21T20:49:11.440 回答
7

在具有自己的默认样式的自定义视图中拉出标准属性(背景)的示例。在此示例中,自定义视图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>
于 2014-08-17T01:57:18.733 回答
5

这似乎是 SDK 中的一个错误。我已经提交了一个关于它的问题,您可能希望对其加注星标以便接收有关它的更新。

作为一种解决方法,您可以使用反射来访问该字段:

Class clazz=Class.forName("android.R$styleable");
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);
于 2010-01-24T14:37:06.433 回答