Problema de espacio de nombres de control personalizado de Android

He estado trabajando en un control personalizado para Android y aunque he intentado hacer lo que se sugiere aquí parece que hay algo que estoy haciendo mal.

Aquí está mi código para ver si alguien puede detectar el problema:

MyComponent.java

public MyComponent(Context context, AttributeSet attrs) { super(context); TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MyComponent); CharSequence myId = arr.getString(R.styleable.MyComponent_identifier); if (myId != null) { this.setIdentifier(myId.toString()); } Integer cds = arr.getInteger(R.styleable.MyComponent_cd_number, 0); if(cds != null) { this.setCds(cds); } arr.recycle(); } 

Attrs.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyComponent"> <attr name="cd_number" format="integer" /> <attr name="identifier" format="string" /> </declare-styleable> </resources> 

Main.xml

 <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bgl="http://schemas.android.com/apk/res/my.test.package.components" android:id="@+id/table" android:layout_width="match_parent" android:layout_height="match_parent"> ... <my.test.package.MyComponent android:id="@+id/hand" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_span="2" bgl:cd_number="4" bgl:identifier="plr"/> ... </TableLayout> 

Cuando pongo esto obtengo los siguientes errores:

Error: No se encontró identificador de recurso para el atributo 'cd_number' en el paquete 'my.test.package' error: No se encontró identificador de recurso para el atributo 'identifier' en el paquete 'my.test.package'

Si cambio mi espacio de nombres a algo como:

 xmlns:bgl="http://schemas.mywhatever.com/apk/res/my.test.package" 

… los errores van camino y la cosa se ejecuta pero myId es nulo y cds es 0 (el valor predeterminado!) De nuevo en el constructor MyComponent.java.

Yo diría que es un error muy básico, pero no ser capaz de detectar y ya que no hay mucha documentación sobre esto me decidí a preguntar aquí.

¡Gracias por adelantado!

De acuerdo. ¡Lo solucioné!

En el post original que tenía:

 xmlns:bgl="http://schemas.android.com/apk/res/my.test.package 

… pero en mi fuente tuve:

 xmlns:bgl="http://schemas.android.com/apk/res/my.test.package.components 

… porque pensé que uno debería poner el URI en el paquete de componentes.

¡ESTO ESTÁ MAL!

En el xmlns debe ser el nombre de la aplicación como se declara en el Manifiesto!

Cuando eliminé la parte "componentes" de los xmlns, "igualó" el nombre de la aplicación en el Manifiesto y los errores se fueron y cuando corrí la cosa en depuración, pude ver los valores que estaba pasando a los parámetros en el XML!

¡Espero que esto ayude a alguien más! Todos los derechos reservados

ACTUALIZAR

Más tarde tuve la necesidad de mover el control a una biblioteca y enfrentar el problema de nuevo. Parece que cuando pones el componente en una biblioteca y lo usas en una aplicación cliente debes declarar los xmlns como se muestra a continuación:

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

Si lo hace (y si la biblioteca se ha declarado como una dependencia de Android), Eclipse (o Android) buscará las dependencias para los enlaces de atributos apropiados.

Tuve un problema similar a este, resultó que estaba llamando a un constructor diferente

Pruebe con el constructor que toma el parámetro defStyle

 public MyComponent(Context context, AttributeSet attrs, int defStyle) 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.