проект библиотеки Android: R.id не может быть разрешен или не является полем - PullRequest
4 голосов
/ 23 декабря 2011

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

идентификатор не может быть разрешенили не является полем

Основной проект не показывает ошибок.

Конечно, я спрашиваю себя, откуда Android знает, откуда импортировать ресурсы, например, в таких строках:

RelativeLayout menuLayout = (RelativeLayout) this.findViewById(R.id.menu_layout);

Но это тоже не работает:

RelativeLayout menuLayout = (RelativeLayout) this.findViewById(net.bla.library.R.id.menu_layout);

Любые идеи?

РЕДАКТИРОВАТЬ: я обнаружил, что это:

Как только явключив проект библиотеки, Eclipse дублирует gen / net.mylibrary.R из библиотеки в основное приложение (так что теперь в папке gen есть 2 пакета: один из приложения и один скопированный из библиотеки).странная вещь: R.id не найден в копии.Есть и другие отличия, например, копия использует дополнительный «финал» для своих определений.

Я действительно понятия не имею, почему это может произойти.Кто-то?

Ответы [ 4 ]

5 голосов
/ 23 декабря 2011

Eclipse иногда любит импортировать android.R, и это вызывает ошибки, подобные тем, которые вы испытываете.

Найдите импорт в верхней части файла и удалите его.

Как указано в « Использование Eclipse | Android с открытым исходным кодом »:

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

2 голосов
/ 10 августа 2012

У меня была похожая проблема, и мне удалось ее решить. Вот что я сделал: Когда я вызываю основное действие моего библиотечного проекта, метод onCreate этого действия вызывает метод setContentView и использует R.layout.main в качестве параметра.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);        

    setContentView(R.layout.main);
    Button btn = (Button) findViewById(R.id.main_button1);
    btn.setOnClickListener(this);

findViewById вернул ноль. Кажется, что main.xml проекта библиотеки переопределяется main.xml основного проекта. Поэтому я просто создал новый макет xml main_libname.xml с тем же содержимым, что и main.xml библиотеки, и использовал этот макет в качестве параметра для setContentView. Это сработало!

2 голосов
/ 23 декабря 2011

Проверьте, находятся ли ресурсы внутри папки res.Все ресурсы должны быть внутри.

  • 0 Proyect
    • 0.1 src
    • 0.2 res
      • 0.2.1 макет
        • 0.2.1.1 main.xml
        • 0.2.1.2 menu_layout.xml
      • 0.2.2 drawables .....

Возможно, вы помещаете данные в папку проекта.

0 голосов
/ 14 мая 2014

У меня также была ошибка «невозможно найти переменную символа ...» для элемента R.id, определенного в проекте библиотеки. Примечательно, что только символы R.id не могли быть разрешены в основном проекте, хотя другие поля R (например, R.layout) были отчетливо видны.

К счастью, я смог наткнуться на решение. Оказалось, что в моем случае в моем основном проекте был определен ресурс (файл макета), имя которого было точно таким же, как и в проекте библиотеки.

Вот как это выглядело в файловой системе:

top_level_project
    main_android_proj
        src
            main
                res
                    layout
                        activity_main.xml
    android_library_subproject
        src
            main
                res
                    layout
                        activity_main.xml

Activity_main.xml моего подпроекта имел следующий идентификатор:

<RelativeLayout....>
    <TextView android:id="@+id/special_text" ... />
</RelativeLayout>

И вот как я пытаюсь ссылаться на идентификатор в коде Java моего основного проекта:

MainActivity.java:

    public void onCreate() {
         setContentView(R.layout.activity_main);
         TextView tv = (TextView) findViewById(R.id.special_text);
         tv.setText("Hello Android");
    }

Чтобы исправить эту проблему, я переименовал поврежденный файл в моем главном проекте на что-то другое.

Кажется, в ваших ресурсах не может быть повторяющихся имен макетов. Действительно, sdk docs указывают на то, что при использовании библиотечных проектов следует соблюдать осторожность при конфликтах имен ресурсов:

  • Конфликт ресурсов

Поскольку инструменты объединяют ресурсы библиотеки проект с таковыми из проекта зависимого приложения, данного Идентификатор ресурса может быть определен в обоих проектах. В этом случае инструменты выберите ресурс из приложения или библиотеки с самым высоким приоритет и отказаться от другого ресурса. По мере развития вашего приложения, помните, что общие идентификаторы ресурсов могут быть определены в более чем одном проекте и будут объединены с ресурсом из приложения или библиотеки с наивысшим приоритетом, имеющей приоритет.

...