Помощь с настраиваемыми атрибутами 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-стильный файл выглядит так:

             

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

    

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

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

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

Я знаю, что этот пост очень стар, но если кто-то придет посмотреть, эта проблема была исправлена ​​в версии 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

Это определенно превосходит копирование файлов и изменение пространств имен, но оно по-прежнему не столь изящно, как должно быть. Наслаждаться.

  • В чем разница между минимальной версией SDK версии / целевой версии SDK и компиляцией версии SDK?
  • Видео YouTube не воспроизводится в WebView
  • Программно добавить один вид ниже другого в относительной компоновке
  • URL-адрес исходной папки?
  • Как установить GridView внутри ScrollView
  • Как получить bitmap из URL-адреса в андроиде?
  • как отображать карту в android с маркером
  • Любой способ ссылки на настройки уведомлений Android для моего приложения?
  • создание пустого растрового изображения и рисование, хотя canvas в android
  • Запретить закрытие экрана активности Android на внешнем прикосновении
  • Разница между getExternalFilesDir и getExternalStorageDirectory ()
  • Давайте будем гением компьютера.