2012-03-16 17 views
6

He estado trabajando en un control personalizado para Android y, aunque intenté hacer lo que se sugiere here, parece haber algo que estoy haciendo mal.Problema de espacio de nombres de Android Custom Control

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 puse esto lo obtienen los siguientes errores:

de error: No se encontró identificador de recursos para el atributo 'cd_number' en el paquete 'my.test.package' de error: No encontré identificador de recursos para el atributo 'identificador' en paquete 'my.test.package'

Si cambio de espacio de nombres a algo como:

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

... los errores van w ay y la cosa se ejecuta pero myId es nulo y cds es 0 (¡el valor predeterminado!) en el constructor MyComponent.java.

Yo diría que es un error muy básico pero no ser capaz de detectarlo y como no hay mucha documentación al respecto, decidí preguntar aquí.

¡Gracias de antemano!

Respuesta

14

Ok. Lo tengo resuelto!

En el post original que tenía:

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

... pero en mi fuente me tenían:

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

... porque pensé que uno debe poner el URI para el paquete de componentes .

¡ESTO ES INCORRECTO!

En los xmlns debe ser el nombre de la aplicación como está declarado en el Manifiesto!

Cuando eliminé la parte de "componentes" de los xmlns "coincidí" con el nombre de la aplicación en el Manifiesto y los errores desaparecieron y cuando ejecuté 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! :-)

ACTUALIZACIÓN

Más tarde tuve la necesidad de pasar el control en una biblioteca y se enfrentó al problema de nuevo. Parece que cuando se pone el componente en una biblioteca y lo utiliza en una aplicación cliente debe declarar las xmlns como abajo:

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

Si lo hace (y tienen la biblioteca declarada como una dependencia de Android) Eclipse (¿o es Android?) buscará en las dependencias los enlaces de atributos apropiados.

+1

Excelente trabajo investigando y proporcionando la respuesta. la reparación res-auto es exactamente lo que necesitaba. – AlanKley

+0

'res-auto'. ¡Tú, bonita! – darksider474

+0

¿Qué es bgl y myns? ¿Cómo podría establecer ese nombre? – Nepster

0

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

intento con el constructor que toma en el parámetro defStyle

public MyComponent(Context context, AttributeSet attrs, int defStyle) 
+0

Gracias, triggs. Lamentablemente, mi problema parece ser otro. Definí el código que sugirió y, si no cambio el espacio de nombres, los errores persisten. Si cambio los xmlns, se comportará igual: el nuevo ctor nunca se llama y myId es nulo y cds es 0 como lo era antes. ¿Más ideas? ¿Nadie? –