在网站following the instructions之后处理Hello,Gallery教程/示例应用程序时,Eclipse报告无法解析R.styleable。
出现此错误的原因是什么,以及如何修复或解决?
答案 0 :(得分:69)
Per this thread,R.styleable已从Android 1.5及更高版本中删除。
有很多方法可以让样本发挥作用,我发现最简单的方法是Justin Anderson在上面链接的线程中推荐的:
使用以下内容创建名为“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();
}
此解决方案基本上将可样式属性定义为应用程序本身的资源,并为其提供在应用程序中工作的必要结构。请注意,如果您只省略两行代码(在a.recycle();之前),应用程序可以正常运行,所有这些代码都会在图库中的图像周围设置灰色背景。
答案 1 :(得分:12)
出现此问题的原因是他们告诉您将资源放入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();
}
那是因为你不应该拥有“android”。在资源之前,样式名称是Theme,但是实际资源中的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. *无法解析类型错误),请检查/gen/R.java以了解实际命名的资源。
答案 2 :(得分:5)
稍微容易一点,当然更多MVCish方式是使用样式系统:
如果您还没有主题,请在styles.xml
下创建res/values
。在其中,您应该:
<?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声明中,您只需添加GalleryItem
即可应用style="@style/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"
/>
这将使您的样式内容远离适配器代码(这很好!)并允许使用更通用的适配器,而不需要关心如何可视化数据。
答案 3 :(得分:4)
我遇到了同样的问题,我在Google的自定义视图示例代码(PieChart)中找到了
import com.example.android.customviews.R;
当我评论该导入行时,Eclipse会注意到错误:“R无法解析为变量”。所以你应该在上面输入你的包装类似的声明。例如:
import your.package.name.R;
它修复了我的其他项目的类似错误
答案 4 :(得分:3)
样式http://developer.android.com/sdk/RELEASENOTES.html
android.R.styleable类及其字段已从公共API中删除,以更好地确保应用程序的向前兼容性。在android.R.styleable中声明的常量是特定于平台的,并且可以在不同版本之间进行任意更改,因此不适合应用程序使用。您仍然可以从资源或代码访问平台的可设置样式属性。为此,请在项目的<declare-styleable>
文件中使用res/values/R.attrs
声明自定义资源元素,然后在其中声明属性。有关示例,请参阅<sdk>/samples/ApiDemos/res/values/attrs.xml
。有关自定义资源的详细信息,请参阅自定义布局资源。请注意,SDK中仍提供了android.R.styleable文档,但仅作为平台各种元素的可设置属性的参考。
答案 5 :(得分:1)
选择答案中有一点错误,而是可以用样式
设置应该是这样的:
<declare-styleable name="Gallery1">
<attr name="android:galleryItemBackground" />
</declare-styleable>
答案 6 :(得分:1)
我尝试了一切,但没有运气。生成的R.java显示了可设置样式的类,但编译显示&#34; Stylable Not found&#34;。我刚刚在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();
}