При работе над Hello, Gallery tutorial/sample app после следуя инструкциям на сайте, Eclipse сообщила, что R.styleable не может быть решена.
В чем причина этой ошибки и как ее можно исправлять или работать?
При работе над Hello, Gallery tutorial/sample app после следуя инструкциям на сайте, Eclipse сообщила, что R.styleable не может быть решена.
В чем причина этой ошибки и как ее можно исправлять или работать?
В этот поток, 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();
}
Это потому, что у вас не должно быть "андроида". предшествующий ресурсам, имя стиля - это тема здесь, но HelloGallery в фактическом ресурсе, а galleryItemBackground помещает андроид между стилизованным именем и атрибутом следующим образом: 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 на то, что на самом деле называются ресурсы.
Немного проще, и, конечно же, более 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
, и установим фоновый ресурс того, к чему применяется стиль, к значению атрибута style 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, но только в качестве ссылки на атрибуты платформы для различных элементов.
У меня такая же проблема, и я нашел в коде пользовательского кода просмотра (PieChart) Google
import com.example.android.customviews.R;
когда я прокомментирую эту строку импорта, Eclipse заметит ошибку: "R не может быть разрешено переменной". поэтому вы должны сделать импорт своего аналогичного заявления выше. Пример:
import your.package.name.R;
он исправляет аналогичную ошибку для других моих проектов
В ответе выбора есть небольшая ошибка, вместо этого стилизована с помощью стиля
Ему должно понравиться следующее:
<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();
}