Android Hello, Gallery tutorial — “R.styleable cannot be resolved”

前端 未结 7 1859
一整个雨季
一整个雨季 2020-11-27 13:23

When working on the Hello, Gallery tutorial/sample app, after following the instructions on the site, Eclipse reported that R.styleable cannot be resolved.

What is t

相关标签:
7条回答
  • 2020-11-27 14:05

    There are have a little error in the select answer,instead stylable with styleable

    It's should like this:

    <declare-styleable name="Gallery1"> 
        <attr name="android:galleryItemBackground" /> 
    </declare-styleable> 
    
    0 讨论(0)
  • 2020-11-27 14:09

    I have the same problem and I found in the custom view sample code (PieChart) of Google

    import com.example.android.customviews.R;
    

    when i comment that import line, Eclipse will notice error: "R cannot to be resolved to a variable". so you should make an import of your package similar statement above. Ex:

    import your.package.name.R;
    

    it fixes similar error for other projects of mine

    0 讨论(0)
  • 2020-11-27 14:14

    Per this thread, R.styleable has been removed from android 1.5 and higher.

    There are a number of ways to get the sample to work, the simplest that I found was recommended by Justin Anderson in the thread linked to above:

    1. Create a new XML file called "resources.xml" with the following content:

      <?xml version="1.0" encoding="utf-8"?> 
      <resources> 
          <declare-styleable name="Gallery1"> 
              <attr name="android:galleryItemBackground" /> 
          </declare-styleable> 
      </resources>
      
    2. Place the XML file in the res\values directory (alongside strings.xml)

    3. Update the constructor for your ImageAdapter with the following (assuming the ImageAdapter class is defined in its own file):

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

    This solution basically defines the styleable attribute as a resource of the app itself and gives it the necessary structure to work in the app. Note that the app can run fine if you just omit the two lines of code (prior to a.recycle();), all this code does is set a grey background around the images in the Gallery.

    0 讨论(0)
  • 2020-11-27 14:16

    The reason for this problem is the resources they tell you to put into res/values/attrs.xml are:

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

    But then you get this adapter, which Eclipse can't figure out and frankly makes no sense:

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

    That's because you shouldn't have "android." preceeding the resources, the styleable name is Theme here but HelloGallery in the actual resource, and the galleryItemBackground puts android between the styleable name and the attribute like this: Theme_android_galleryItemBackground

    So if want the ImageAdapter method to work with the resources you're given, you should rewrite it like this:

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

    For future problems regarding resources (R.* cannot be resolved type errors), examine /gen/R.java for what the resources are actually being named.

    0 讨论(0)
  • 2020-11-27 14:18

    I tried everything, but with no luck. The generated R.java was showing the stylable class but the compilation was showing "Stylable Not found". I just added the package name before R, after the change, everything is working fine now...

    So, if your package name is com.example.test, then modify following code...

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

    }

    TO

    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();
    }
    
    0 讨论(0)
  • 2020-11-27 14:26

    A slightly easier, and certainly more MVCish way is to use the style system:

    If you don't have a theme yet, create a styles.xml under res/values. In it, you should have:

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

    This will define a new style which we are calling GalleryItem and setting the background resource of whatever the style gets applied to, to the value of the style attribute android:attr/galleryItemBackground (you can see a lot of examples of this being done in the frameworks/base/core/res/res/values/themes.xml in Android's source).

    Then in an XML declaration for an ImageView, you can simply apply your GalleryItem style by adding style="@style/GalleryItem", eg:

    <?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"
    />
    

    This will keep your style stuff out of your adapter code (which is good!) and allow for more generic adapters that don't need to care how you're visualizing your data.

    0 讨论(0)
提交回复
热议问题