Android Hello,图库教程 - “R.styleable无法解析”

时间:2009-11-11 19:29:21

标签: android eclipse

在网站following the instructions之后处理Hello,Gallery教程/示例应用程序时,Eclipse报告无法解析R.styleable。

出现此错误的原因是什么,以及如何修复或解决?

7 个答案:

答案 0 :(得分:69)

Per this thread,R.styleable已从Android 1.5及更高版本中删除。

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

  1. 使用以下内容创建名为“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();
    }
    
  4. 此解决方案基本上将可样式属性定义为应用程序本身的资源,并为其提供在应用程序中工作的必要结构。请注意,如果您只省略两行代码(在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();
}