Подтвердить что ты не робот

Android Hello, руководство по галерее - "R.styleable не может быть разрешен"

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

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

4b9b3361

Ответ 1

В этот поток, 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();), весь этот код устанавливает серый фон вокруг изображений в Галерее.

Ответ 2

Причиной этой проблемы являются ресурсы, которые они вам скажут в 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 на то, что на самом деле называются ресурсы.

Ответ 3

Немного проще, и, конечно же, более 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"
/>

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

Ответ 4

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, но только в качестве ссылки на атрибуты платформы для различных элементов.

Ответ 5

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

import com.example.android.customviews.R;

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

import your.package.name.R;

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

Ответ 6

В ответе выбора есть небольшая ошибка, вместо этого стилизована с помощью стиля

Ему должно понравиться следующее:

<declare-styleable name="Gallery1"> 
    <attr name="android:galleryItemBackground" /> 
</declare-styleable> 

Ответ 7

Я пробовал все, но не повезло. Сгенерированный 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();
}