Android Hello,Gallery教程 – “R.styleable无法parsing”

在处理Hello,Gallery教程/示例应用程序时, 按照网站上的说明进行操作后,Eclipse报告了R.styleable无法parsing。

这个错误的原因是什么?如何解决或解决?

根据这个线程 ,R.styleable已经从android 1.5及更高版本中删除。

有很多方法可以让样本起作用,我发现的最简单的方法是由Justin Anderson在上面的链接中推荐的:

  1. 使用以下内容创build一个名为“resources.xml”的新XML文件:

    <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="Gallery1"> <attr name="android:galleryItemBackground" /> </declare-styleable> </resources> 
  2. 将XML文件放在res \ values目录(strings.xml旁边)

  3. 使用以下方法更新ImageAdapter的构造函数(假定ImageAdapter类在其自己的文件中定义):

     public ImageAdapter(Context c) { mContext = c; TypedArray a = c.obtainStyledAttributes(R.styleable.Gallery1); mGalleryItemBackground = a.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 0); a.recycle(); } 

这个解决scheme基本上将可定制的属性定义为应用程序本身的资源,并为其提供在应用程序中工作的必要结构。 请注意,如果您只是忽略了两行代码(在a.recycle();之前),则该应用程序可以正常运行,但是所有此代码都会在Gallery中的图像周围设置灰色背景。

这个问题的原因是他们告诉你放在res / values / attrs.xml中的资源是:

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="HelloGallery"> <attr name="android:galleryItemBackground" /> </declare-styleable> </resources> 

但是,然后你得到这个适配器,Eclipse无法弄清楚,坦率地说,没有任何意义:

 public ImageAdapter(Context c) { mContext = c; TypedArray a = obtainStyledAttributes(android.R.styleable.Theme); mGalleryItemBackground = a.getResourceId( android.R.styleable.Theme_galleryItemBackground, 0); a.recycle(); } 

那是因为你不应该有“机器人”。 前面的资源,可风格的名字是这里的主题,但在实际的资源HelloGallery,和galleryItemBackground放在样式名称和属性像这样的android:Theme_android_galleryItemBackground

所以如果想让ImageAdapter方法和你给的资源一起工作,你应该像这样重写它:

 public ImageAdapter(Context c) { mContext = c; TypedArray a = obtainStyledAttributes(R.styleable.HelloGallery); mGalleryItemBackground = a.getResourceId( R.styleable.HelloGallery_android_galleryItemBackground, 0); a.recycle(); } 

对于将来有关资源的问题(R. *无法parsingtypes错误),请检查/gen/R.java中实际正在命名的资源。

一个稍微简单的,当然更MVCish的方式是使用风格系统:

如果您还没有主题,请在res/values下创buildstyles.xml 。 其中,你应该有:

 <?xml version="1.0" encoding="utf-8"?> <resources> <style name="GalleryItem"> <item name="android:background">?android:attr/galleryItemBackground</item> </style> </resources> 

这将定义一个新的样式,我们调用GalleryItem并设置任何风格被应用到的背景资源,风格属性的值android:attr/galleryItemBackground (你可以看到很多这样做的例子在Android源代码中的frameworks/base/core/res/res/values/themes.xml )。

然后在一个ImageView的XML声明中,你可以通过添加style="@style/GalleryItem"来简单地应用你的GalleryItem风格,例如:

 <?xml version="1.0" encoding="utf-8"?> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/icon" android:scaleType="fitXY" android:layout_width="136dip" android:layout_height="88dip" style="@style/GalleryItem" /> 

这将保持你的风格的东西超出你的适配器代码(这是好!),并允许更多的通用适配器,不需要关心如何可视化您的数据。

styleable不支持http://developer.android.com/sdk/RELEASENOTES.html

android.R.styleable类及其字段已从公共API中删除,以更好地确保应用程序的向前兼容性。 android.R.styleable中声明的常量是特定于平台的,并且可以随意更改所有版本,所以不适合应用程序使用。 您仍然可以从您的资源或代码访问平台的样式属性。 为此,在项目的res/values/R.attrs文件中使用<declare-styleable>声明自定义资源元素,然后在里面声明属性。 有关示例,请参见<sdk>/samples/ApiDemos/res/values/attrs.xml 。 有关自定义资源的更多信息,请参阅自定义布局资源。 请注意,android.R.styleable文档仍然在SDK中提供,但仅作为各个元素的平台可修改属性的参考。

我有同样的问题,我发现在谷歌的自定义视图示例代码(PieChart)

 import com.example.android.customviews.R; 

当我注释到导入行时,Eclipse会注意到错误:“R无法parsing为variables”。 所以你应该把你的包导入上面类似的声明。 例如:

 import your.package.name.R; 

它修复了我的其他项目类似的错误

在select答案中有一个小错误,而不是可风格样式

这应该是这样的:

 <declare-styleable name="Gallery1"> <attr name="android:galleryItemBackground" /> </declare-styleable> 

我尝试了一切,但没有运气。 生成的R.java显示类风格的类,但汇编显示“Stylable not found”。 我刚刚在R之前添加了软件包名称,更改之后,现在一切正常。

所以,如果你的包名是com.example.test,那么修改下面的代码…

 public ImageAdapter(Context c) { mContext = c; TypedArray a = c.obtainStyledAttributes(R.styleable.Gallery1); mGalleryItemBackground = a.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 0); a.recycle(); 

}

 public ImageAdapter(Context c) { mContext = c; TypedArray a = c.obtainStyledAttributes(com.example.test.R.styleable.Gallery1); mGalleryItemBackground = a.getResourceId(com.example.test.R.styleable.Gallery1_android_galleryItemBackground, 0); a.recycle(); }