Android Hello,Gallery教程 – “R.styleable无法parsing”
在处理Hello,Gallery教程/示例应用程序时, 按照网站上的说明进行操作后,Eclipse报告了R.styleable无法parsing。
这个错误的原因是什么?如何解决或解决?
根据这个线程 ,R.styleable已经从android 1.5及更高版本中删除。
有很多方法可以让样本起作用,我发现的最简单的方法是由Justin Anderson在上面的链接中推荐的:
-
使用以下内容创build一个名为“resources.xml”的新XML文件:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="Gallery1"> <attr name="android:galleryItemBackground" /> </declare-styleable> </resources>
-
将XML文件放在res \ values目录(strings.xml旁边)
-
使用以下方法更新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(); }