Intereting Posts
Android onViewClickListener не работает Реализация функций USSD. Связывание службы с PhoneUtils без перезапуска телефона при каждом обновлении Картинные карты мерцают между рельефом и обычными типами Как правильно включить 10 "и 7" макеты Как настройка baselineAligned to false улучшает производительность в LinearLayout? Изменение стиля брекетов в Android Studio OnViewCreated – неправильное место для замены фрагмента? ActionBarSherlock – Как установить дополнение к значку каждой панели действий? Как сделать Android Spinner с исходным текстом «Выбрать один», Как я могу не показывать экран телефона все время при совершении звонка? Android Google Maps фрагмент в xml. Я получаю "Неожиданный префикс пространства имен" Задайте другую minSdkVersion для testAndroid, чем для основного приложения. Диспетчер приложений Android показывает неправильное имя приложения Android – создать виртуальную камеру или перезаписать реальный поток Cam? (/ Dev / msm_camera / frame0, v4l2loopback)? Приложение падает после первого входа в Facebook

Помощь с настраиваемыми атрибутами View в проекте библиотеки Android

У меня есть пользовательский PieTimer View в Android Library Project

package com.mysite.android.library.pietimer; public class PieTimerView extends View { ... 

У меня также есть файл атрибутов XML, который я использую в своем PieTimer

  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PieTimerView); 

XML-файл выглядит так:

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="PieTimerView"> <attr name="max_size" format="dimension" /> <attr name="start_angle" format="string" /> <attr name="start_arc" format="string" /> <attr name="ok_color" format="color" /> <attr name="warning_color" format="color" /> <attr name="critical_color" format="color" /> <attr name="background_color" format="color" /> </declare-styleable> </resources> 

У меня есть PieTimer в файле макета для проекта, который использует библиотеку, например

 <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout_gravity="center_horizontal" xmlns:app="http://schemas.android.com/apk/res/com.mysite.android.library.myapp" xmlns:pie="com.mysite.library.pietimer" > <com.mysite.library.pietimer.PieTimerView pie:start_angle="270" pie:start_arc="0" pie:max_size="70dp" pie:ok_color="#9798AD" pie:warning_color="#696DC1" pie:critical_color="#E75757" pie:background_color="#D3D6FF" android:visibility="visible" android:layout_height="wrap_content" android:id="@+id/clock" android:layout_width="wrap_content" android:layout_alignParentRight="true"> </com.mysite.library.pietimer.PieTimerView> 

Раньше я использовал xmlns:app в качестве пространства имен для таких атрибутов, как app:ok_color но когда я сделал проект проектом библиотеки и имел бесплатную и полную версию библиотеки, я обнаружил, что она больше не работает, поэтому я добавил пространство имен пирога.

Отображается PieTimerView, но атрибут не работает, они используют значение по умолчанию (это не происходило раньше), поэтому здесь существует конфликт конфликтов пространства имен.

Каков правильный способ сделать это?

Solutions Collecting From Web of "Помощь с настраиваемыми атрибутами View в проекте библиотеки Android"

Я знаю, что этот пост очень стар, но если кто-то придет посмотреть, эта проблема была исправлена ​​в версии 17+ ADT. Любые службы или действия объявляют пространство имен следующим образом:

 xmlns:custom="http://schemas.android.com/apk/res-auto" 

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

Ref: http://www.androidpolice.com/2012/03/21/for-developers-adt-17-sdk-tools-r17-and-support-package-r7-released-with-new-features-and- исправления-для-пух-наращивание системы, и эмулятор /

После двух часов работы с моим коллегой мы выяснили, как это сделать: Библиотека: com.library mywidget.java с классом MyWidget

Attrs.xml:

 <declare-styleable name="MyWidget"> 

И положите свой attr

Вместо того, чтобы иметь свой макет (например, main.xml) с объявленным в нем виджетами, juste создайте файл my_widget.xml в макете вашей библиотеки. my_widget.xml

 <?xml version="1.0" encoding="utf-8"?> <com.library.MyWidget xmlns:android="http://schemas.android.com/apk/res/android" xmlns:widget="http://schemas.android.com/apk/res/com.library" android:id="@+id/your_id" android:layout_width="fill_parent" android:layout_height="fill_parent" widget:your_attr> </com.library.MyWidget> 

Для включения его в ваш макет, juste put

 <include layout="@layout/my_widget"></include> 

Приложение: com.myapp

Вам просто нужно дублировать my_widget.xml здесь и изменить пространство имен:

 <?xml version="1.0" encoding="utf-8"?> <com.library.MyWidget xmlns:android="http://schemas.android.com/apk/res/android" xmlns:widget="http://schemas.android.com/apk/res/com.myapp" <---- VERY IMPORTANT android:id="@+id/your_id" android:layout_width="fill_parent" android:layout_height="fill_parent" widget:your_attr> </com.library.MyWidget> 

И обычно это сработает!

Существует известная ошибка и ее описание здесь: ошибка № 9656 . Я также описал, почему это происходит в моем сообщении в блоге.

Для всех API-интерфейсов это квитанция ( если библиотека связана как JAR , но она также должна работать как ссылка на проект библиотеки Android)

Проект библиотеки: AndroidManifest.xml

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.myapp.library1" ... </manifest> 

Проект библиотеки: Attrs.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyCustStyle" > <attr name="MyAttr1" format="dimension" /> .. </resources> 

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

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:library1="http://schemas.android.com/apk/com.myapp.library1" ... > <com.myapp.library1.MyCustomView library1:MyAttr1="16dp" ... /> </RelativeLayout> 

В коде приложения, если вы хотите получить доступ к ресурсам из использования библиотеки (например, массив «MyCustomArray», определенный в файле arrays.xml from lib), используйте:

 getResources().getStringArray(com.myapp.library1.R.array.MyCustomArray) 
 xmlns:app="http://schemas.android.com/apk/res/com.mysite.android.library.myapp" 

Возможно, указанный вами пакет (com.mysite.android.library.myapp) указан неверно. Вы можете проверить атрибут пакета элемента minifest в файле AndroidMinifest.xml. Они должны быть одинаковыми.

Это решение сработало для меня:

https://gist.github.com/1105281

Он не использует TypedArray и требует, чтобы представление содержало в нем имя проекта проекта библиотеки.

Он также не использует значения стиля на программном уровне. Вы также должны жестко закодировать строки атрибутов в представлении.

Однако вы должны объявить те же самые имена атрибутов, что и Lint, чтобы не показывать ошибку при написании XML-части.

Ссылка на исходное сообщение на code.google.com:

http://code.google.com/p/android/issues/detail?id=9656#c17

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