Помощь с настраиваемыми атрибутами View в проекте библиотеки Android
У меня есть пользовательский PieTimer View в проекте Android Library
package com.mysite.android.library.pietimer; public class PieTimerView extends View { ...
У меня также есть файл атрибутов XML, который я использую в своем PieTimer
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PieTimerView);
XML-стильный файл выглядит так:
- Дилемма: когда использовать Fragments vs Activities:
- Как импортировать контакты из телефонной книги в нашу заявку
- Задача Android ASync ProgressDialog не отображается, пока фоновый stream не завершится
- Как включить / отключить WiFi из приложения?
- Android-музыкальная музыка
У меня есть PieTimer в файле макета для проекта, который использует библиотеку, например
Раньше я использовал xmlns:app
в качестве пространства имен для таких атрибутов, как app:ok_color
но когда я сделал проект проектом библиотеки и имел бесплатную и полную версию, реализующую библиотеку, я обнаружил, что она больше не работает, поэтому я добавил пространство имен пирога.
PieTimerView отображает, но атрибут не работает, они используют значение по умолчанию (это не происходило раньше), поэтому здесь существует конфликт конфликтов пространства имен.
Каков правильный способ сделать это?
- Измените тему деятельности программы
- Подсчет голосов в EditText Changed Listener
- Не удалось выполнить dex: несколько файлов dex определяют
- Android Studio: установка приложения не выполнена
- Динамически добавлять TableRow в TableLayout
- как получить идентификатор электронной почты из facebook sdk в приложениях для Android?
- измерение представления перед его рендерингом
- Настроить Android Intent.ACTION_SEND
Я знаю, что этот пост очень стар, но если кто-то придет посмотреть, эта проблема была исправлена в версии 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 с classом MyWidget
attrs.xml:
и поместите свой attr
Вместо того, чтобы иметь свой макет (например, main.xml) с объявленным в нем виджетами, juste создайте файл my_widget.xml в макете вашей библиотеки. my_widget.xml
для включения его в ваш макет, juste put
Приложение: com.myapp
Вам просто нужно дублировать my_widget.xml здесь и изменить пространство имен:
И обычно это сработает!
Существует известная ошибка и ее описание здесь: ошибка № 9656 . Я также описал, почему это происходит в моем сообщении в блоге.
Для всех API это квитанция ( если библиотека связана как JAR , но она также должна работать как ссылка на проект библиотеки андроида)
Проект библиотеки: AndroidManifest.xml
Проект библиотеки: Attrs.xml
..
Проект приложения MainLayout.xml (или макет, где вы используете настраиваемый элемент управления)
В коде приложения, если вы хотите получить доступ к ресурсам из использования библиотеки (например, массив «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) указан неверно. вы можете проверить атрибут package элемента 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
Это определенно превосходит копирование файлов и изменение пространств имен, но оно по-прежнему не столь изящно, как должно быть. Наслаждаться.