Android Hello, учебник по галерее - "R.styleable не может быть решена"
При работе с приложением Hello, Gallery / примером приложения, следуя инструкциям на сайте, Eclipse сообщила, что R.styleable не может быть разрешен.
В чем причина этой ошибки, и как ее можно исправить или обойти?
7 ответов
Согласно этой теме, R.styleable был удален с Android 1.5 и выше.
Есть несколько способов заставить образец работать, самый простой, который я нашел, был рекомендован Джастином Андерсоном в теме, связанной с выше:
Создайте новый XML-файл с именем "resources.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(); }
Это решение в основном определяет атрибут styleable как ресурс самого приложения и дает ему необходимую структуру для работы в приложении. Обратите внимание, что приложение может работать нормально, если вы просто пропустите две строки кода (до a.recycle();), и все, что делает этот код, это устанавливает серый фон вокруг изображений в Галерее.
Причиной этой проблемы являются ресурсы, которые они говорят вам поместить в 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 для того, что ресурсы на самом деле именуются.
У меня та же проблема, и я нашел в коде пользовательского представления (PieChart) Google
import com.example.android.customviews.R;
когда я комментирую эту строку импорта, Eclipse обнаружит ошибку: "R не может быть преобразован в переменную". поэтому вы должны сделать импорт вашего пакета аналогичным заявлением выше. Пример:
import your.package.name.R;
исправляет аналогичную ошибку для других моих проектов
Немного проще и, конечно, более 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"
/>
Это исключит ваши вещи из кода адаптера (что хорошо!) И позволит использовать более общие адаптеры, которым не нужно заботиться о том, как вы визуализируете свои данные.
styleable не поддерживается 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, но только в качестве ссылки на настраиваемые атрибуты платформы для различных элементов.
В выбранном ответе есть небольшая ошибка, вместо
Это должно быть так:
<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();
}