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

Указание зависимостей проекта Android (в Eclipse)

У меня есть два проекта Android, "проект библиотеки", содержащий пользовательский макет, и "проект приложения", содержащий приложение, которое использует макет.

Кажется, что все создается и выполняется отлично, за исключением того, что редактор визуального макета генерирует исключение ClassNotFoundException (которое, как я полагаю, является ошибкой в ​​подключаемом модуле), но когда я пытаюсь начать использовать атрибуты, определенные для пользовательский макет в xml, я больше не могу строить. То есть; это работает:

<?xml version="1.0" encoding="utf-8"?>
<se.fnord.android.layout.PredicateLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
  <TextView
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="asdfasdf"
    />
</se.fnord.android.layout.PredicateLayout>

Если это не так:

<?xml version="1.0" encoding="utf-8"?>
<se.fnord.android.layout.PredicateLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fnord="http://schemas.android.com/apk/res/se.fnord.android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
  <TextView
    fnord:layout_horizontalSpacing="1px"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="asdfasdf"
    />
</se.fnord.android.layout.PredicateLayout>

Сбой сборки с сообщением от aapt:

ОШИБКА Идентификатор ресурса не найден для атрибута 'layout_horizontalSpacing' в пакете 'se.fnord.android'

Идентификатор ресурса существует в R файле, а attrs.xml содержит проект библиотеки, и если я помещаю код макета и ресурсы непосредственно в проект приложения, все работает нормально. Атрибут layout_horizontalSpacing (и layout_verticalSpacing) - это настраиваемый атрибут, используемый в классе PredicateLayout.LayoutParam для указания расстояния до следующего виджета.

До сих пор я пробовал стандартные способы затмения, указав ссылки на проект и зависимости от проекта. Мне также сказали попробовать тег в манифесте приложения, что не помогло.

Итак, что мне нужно сделать для ссылок в xml файле?

Я не знаю, соответствует ли это, но манифест библиотеки выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="se.fnord.android"
      android:versionCode="1" android:versionName="1.0.0">
</manifest>

"Приложение" выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="se.fnord.appname"
      android:versionCode="1" android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AppName"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

( "PredicateLayout", btw, является очищенной версией этого).

4b9b3361

Ответ 1

Самые ранние версии Android-sdk не поддерживают совместное использование на уровне исходного кода. Вы могли бы добавить ваши файлы .class, а затем добавить их в папку lib/, но это решение не позволяло напрямую использовать исходный код и так же важно не поддерживать совместное использование ресурсов или файлов helpl.

Затем в мае 2010 года Android представил механизм библиотечного проекта. Проект библиотеки структурирован очень похож на обычный Android-проект, но вместо того, чтобы использоваться для создания apk, он служит только для предоставления кода и ресурсов другим проектам. Как и обычный проект, проект библиотеки обычно содержит папки src и res, а также файл AndroidManifest.xml; однако манифест должен быть в основном пустым, за исключением элемента манифеста и атрибута package (больше не верного), теперь вы можете объявлять действия и другие компоненты в манифесте вашего проекта библиотеки). Кроме того, файл project.properties для проекта библиотеки должен содержать свойство:

"android.library=true"

Чтобы сделать ссылку из обычного (apk-production) проекта на проект библиотеки, вам нужно добавить строку "android.library.reference.N" в файл project.properties обычного проекта. Например, если мой основной проект хочет указать на два проекта библиотеки, файл project.properties для основного проекта будет включать следующее:

android.library.reference.1=../LibraryA
android.library.reference.2=../../LibraryB

где../и../../- соответствующие пути от основного проекта к библиотечным проектам (это только пример). Обратите внимание, что этот список ссылок основан на 1 и не должен содержать пробелов или дубликатов. Google хорошо знает, что это не идеальная система, но это разумное решение, совместимое с Ant и Eclipse. Вообще говоря, ваша IDE будет пытаться поддерживать эти файлы для вас, но иногда вам может понадобиться отредактировать их вручную.

Сначала проекты библиотеки не поддерживали следующее:

  • Библиотечные проекты, указывающие на другие проекты библиотеки
  • Библиотечные проекты, содержащие вспомогательные файлы
  • Библиотечные проекты, содержащие папку с ресурсами

Однако последующие выпуски sdk решают все эти проблемы.

Для получения дополнительной информации о библиотечных проектах см. официальную документацию.

Ответ 2

Экспортировать проект как JAR - это неправильный способ связать проект библиотеки с проектом приложения через Properties → Java Build Path → Library. Не нужно связывать проект как необходимый проект через "Свойства" → "Путь сборки Java" → "Проекты".

Прежде всего, прочитайте тему проектов библиотеки в Android-разработчиках → Разработка → Управление проектами: http://developer.android.com/guide/developing/projects/index.html#LibraryProjects После этого снова прочитайте раздел "Настройка проекта библиотеки" и "Обращение к темам проекта библиотеки" в Android Developers → Разработка → Управление проектами → Из Eclipse с ADT

Итак... шаги:

  • Создайте свой проект библиотеки как проект Android;
  • Установить "библиотека" в свойствах проекта → Android Создать свое приложение проект обычно;
  • Добавьте ссылку на свою библиотеку в свойствах проекта → Android → Добавить.

После этого вы можете использовать все классы, компоненты (действия, службы, поставщики, получатели), ресурсы и т.д.

Например: для ссылки на любые ресурсы в макете xml, например, вы должны использовать @mylib: id/my_id или @mylib: layout/my_lib_layout

Примечание. Если вы используете компоненты вашей библиотеки в проекте приложения, вы должны реплицировать их в манифесте приложения.

Ответ 3

Кроме того, я получил атрибуты, работающие, но не так, как должно работать, я думаю.

Вы должны использовать в качестве пространства имен элемент, который использует ваши пользовательские атрибуты, пространство имен основного приложения, а не проект библиотеки. Итак, в вашем примере, если вы указали для значения "xmlns: fnord" пространство имен вашего проекта приложения, оно работает.

Кроме того, при чтении пользовательских атрибутов в пользовательском конструкторе PredicateLayout(Context,AttributeSet) вы должны указать пространство имен приложений, а также при вызовах attributes.getAttributeValue().

Какая боль, поскольку этот код находится в вашем приложении библиотеки, который не должен/не должен знать о проекте приложения, в котором он используется. Я работал вокруг этого, получив вызов приложения статическим методом ViewUtil.setAttributeNamespace( appNamespace) в моем приложении onCreate(), и пользовательские представления библиотеки используют это пространство имен для извлечения пользовательских атрибутов. Файл attrs.xml также может оставаться в проекте библиотеки. Теперь единственное уродство в том, что XML-макет должен использовать пространство имен приложений в пользовательских представлениях, поэтому вы не можете поместить эти макеты XML в проект библиотеки.

Ответ 4

Экспортируйте проект библиотеки как JAR и ссылайтесь на него в своем проекте приложения "Java Build Path" как JAR.

Ответ 5

"Экспортировать вашу библиотеку в качестве jar-решения" работает только в том случае, если проект библиотеки содержит только исходный код. В этом случае в вопросе OP упоминается, что его проект библиотеки содержит связанные с ui файлы.

У нас есть то же самое, что и моя команда, желающая иметь библиотечные проекты, которые содержат ui-родственный источник и ресурсы. Мы завершили капитальный ремонт нашей системы сборки Ant, чтобы приложения охватывали проекты библиотеки во время сборки. К сожалению, решение такого типа, похоже, не совместимо с Eclipse, и это серьезный источник разочарования для разработчиков. Мы все еще можем использовать Eclipse, но нам нужно прыгать через обручи, чтобы заставить его работать, и приходится мириться с уменьшенной производительностью.