Android Hello, учебник по галерее - "R.styleable не может быть решена" - PullRequest
37 голосов
/ 11 ноября 2009

При работе с приложением Hello, Gallery или примером приложения после , следуя инструкциям на сайте, Eclipse сообщил, что R.styleable не может быть разрешен.

В чем причина этой ошибки и как ее можно исправить или обойти?

Ответы [ 7 ]

69 голосов
/ 11 ноября 2009

За эта тема , R.styleable была удалена с Android 1.5 и выше.

Существует несколько способов заставить образец работать, самый простой из найденных мной был рекомендован Джастином Андерсоном в теме, указанной выше:

  1. Создайте новый XML-файл с именем «resources.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();
    }
    

Это решение в основном определяет атрибут styleable как ресурс самого приложения и дает ему необходимую структуру для работы в приложении. Обратите внимание, что приложение может работать нормально, если вы просто пропустите две строки кода (до a.recycle ();), и все, что делает этот код, это устанавливает серый фон вокруг изображений в Галерее.

12 голосов
/ 06 мая 2010

Причиной этой проблемы являются ресурсы, которые они говорят вам поместить в 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();
}

Это потому, что у тебя не должно быть "андроида". перед ресурсами, здесь настраиваемым именем является 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 для того, что ресурсы на самом деле именуются.

5 голосов
/ 09 декабря 2010

Немного проще и, конечно, более 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 (вы можете увидеть множество примеров этого существа сделано в frameworks/base/core/res/res/values/themes.xml в источнике Android).

Затем в объявлении XML для ImageView вы можете просто применить свой стиль 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"
/>

Это избавит ваш стиль от кода вашего адаптера (что хорошо!) И позволит использовать более общие адаптеры, которым не нужно заботиться о том, как вы визуализируете свои данные.

4 голосов
/ 08 июня 2014

У меня та же проблема, и я нашел в коде пользовательского представления (PieChart) Google

import com.example.android.customviews.R;

когда я комментирую эту строку импорта, Eclipse обнаружит ошибку: «R не может быть преобразован в переменную». поэтому вы должны сделать импорт вашего пакета аналогичным заявлением выше. Пример:

import your.package.name.R;

исправляет аналогичную ошибку для других моих проектов

3 голосов
/ 11 апреля 2012

стиль не поддерживается 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. Для получения дополнительной информации о пользовательских ресурсах см. Пользовательские ресурсы макета. Обратите внимание, что документация android.R.styleable по-прежнему предоставляется в SDK, но только в качестве ссылки на настраиваемые атрибуты платформы для различных элементов.

1 голос
/ 25 марта 2014

Я попробовал все, но безуспешно. В сгенерированном 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();
}
1 голос
/ 17 мая 2010

В выбранном ответе есть небольшая ошибка, вместо этого можно вводить стилизуемый

Это должно быть так:

<declare-styleable name="Gallery1"> 
    <attr name="android:galleryItemBackground" /> 
</declare-styleable> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...