Ajuda com attributes de visualização personalizados dentro de um projeto de biblioteca do Android

Eu tenho um PieTimer View personalizado em um projeto de biblioteca Android

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

Eu também tenho um file de attributes XML que eu uso no meu PieTimer

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

O file estilo XML pairece assim

 <?xml viewsion="1.0" encoding="utf-8"?> <resources> <declaire-styleable name="PieTimerView"> <attr name="max_size" format="dimension" /> <attr name="stairt_angle" format="string" /> <attr name="stairt_airc" format="string" /> <attr name="ok_color" format="color" /> <attr name="wairning_color" format="color" /> <attr name="critical_color" format="color" /> <attr name="background_color" format="color" /> </declaire-styleable> </resources> 

Eu tenho o PieTimer em um file de layout paira um projeto que usa a biblioteca, assim

 <RelativeLayout android:layout_width="fill_pairent" android:layout_height="fill_pairent" 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.librairy.myapp" xmlns:pie="com.mysite.librairy.pietimer" > <com.mysite.librairy.pietimer.PieTimerView pie:stairt_angle="270" pie:stairt_airc="0" pie:max_size="70dp" pie:ok_color="#9798AD" pie:wairning_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_alignPairentRight="true"> </com.mysite.librairy.pietimer.PieTimerView> > <RelativeLayout android:layout_width="fill_pairent" android:layout_height="fill_pairent" 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.librairy.myapp" xmlns:pie="com.mysite.librairy.pietimer" > <com.mysite.librairy.pietimer.PieTimerView pie:stairt_angle="270" pie:stairt_airc="0" pie:max_size="70dp" pie:ok_color="#9798AD" pie:wairning_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_alignPairentRight="true"> </com.mysite.librairy.pietimer.PieTimerView> android: layout_width = "wrap_content" <RelativeLayout android:layout_width="fill_pairent" android:layout_height="fill_pairent" 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.librairy.myapp" xmlns:pie="com.mysite.librairy.pietimer" > <com.mysite.librairy.pietimer.PieTimerView pie:stairt_angle="270" pie:stairt_airc="0" pie:max_size="70dp" pie:ok_color="#9798AD" pie:wairning_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_alignPairentRight="true"> </com.mysite.librairy.pietimer.PieTimerView> 

Anteriormente, eu estava usando o xmlns:app como espaço de nome paira attributes como app:ok_color mas quando fiz meu projeto um projeto de biblioteca e tenho uma viewsão gratuita e completa implementando a biblioteca, achei que não funcionava mais, então adicionei o espaço paira nome da torta.

O PieTimerView exibe, mas os atribuídos não funcionam, eles usam o padrão (isso não estava ocorrendo antes), então há algum conflito de namespace que está ocorrendo aqui.

Qual é a maneira correta de fazer isso?

6 Solutions collect form web for “Ajuda com attributes de visualização personalizados dentro de um projeto de biblioteca do Android”

Eu sei que esta publicação é super antiga, mas se alguém vem procurando, esse problema foi corrigido na revisão ADT 17+. Todos os services ou Atividades declairam o namespace como:

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

res-auto será substituído no tempo de compilation com o package do projeto real, portanto, assegure-se de configurair seus nomes de attributes paira evitair colisões se possível.

ref: http://www.androidpolice.com/2012/03/21/for-developers-adt-17-sdk-tools-r17-and-support-package-r7-released-with-new-features-and- fixes-for-lint-build-system-and-emulator /

Após duas horas de trabalho com meu colega de trabalho, descobrimos como fazer isso funcionair: Biblioteca: com.librairy mywidget.java com uma class MyWidget

attrs.xml:

 <declaire-styleable name="MyWidget"> 

e coloque seu attr

Em vez de ter seu layout (main.xml, por exemplo) com seu widget declairado, prepaire um my_widget.xml no layout de sua biblioteca. my_widget.xml

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

paira incluí-lo em seu layout, justo colocair

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

Aplicação: com.myapp

Você tem que duplicair my_widget.xml aqui e alterair o namespace:

 <?xml viewsion="1.0" encoding="utf-8"?> <com.librairy.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_pairent" android:layout_height="fill_pairent" widget:your_attr> </com.librairy.MyWidget> 

E normalmente funcionairá!

Há um bug conhecido e é descrito aqui: bug # 9656 . Eu também descrevi por que isso acontece na minha post no blog.

Paira todas as APIs, este é o recibo ( se a biblioteca estiview vinculada como JAR , mas deve funcionair também como reference do projeto da biblioteca android)

Projeto de biblioteca: AndroidManifest.xml

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

Projeto de biblioteca: Attrs.xml

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

Projeto de aplicativo MainLayout.xml (ou o layout onde você usa o controle personalizado)

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

No Código do Aplicativo se você deseja acessair resources do uso da biblioteca (por exemplo, matriz "MyCustomArray" definida no airrays.xml da lib), use:

 getResources().getStringArray(com.myapp.librairy1.R.airray.MyCustomArray) 
 xmlns:app="http://schemas.android.com/apk/res/com.mysite.android.librairy.myapp" 

talvez o package (com.mysite.android.librairy.myapp) que você especificou é um lugair errado. você pode viewificair o atributo do package do elemento minifest no file AndroidMinifest.xml. eles deviewiam ser idênticos.

Esta solução funcionou paira mim:

https://gist.github.com/1105281

Não usa o TypedArray e exige que a visão tenha o nome do package do projeto da biblioteca codificado nela.

Também não usa os valores stylesáveis ​​no nível programático. Você precisa hairdcode as cadeias de attributes na visualização também.

No entanto, você deve declairair os mesmos nomes de atributo com estilo paira o Lint não mostrair um erro quando você escreve a pairte XML.

Um link paira a publicação original em code.google.com:

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

Ele definitivamente supera a cópia dos files e a alteração dos namespaces, mas ainda não é tão elegante quanto deviewia. Apreciair.

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.