Проблема пространства имен пользовательского элемента управления Android - PullRequest
7 голосов
/ 17 марта 2012

Я работал над пользовательским элементом управления для Android, и хотя я пытался сделать то, что предложено здесь , похоже, что-то я делаю неправильно.

Вот мой код, чтобы узнать, может ли кто-нибудь определить проблему:

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>

Когда я ставлю это, я получаю следующие ошибки:

ошибка: нетОбнаружен идентификатор ресурса для атрибута «cd_number» в пакете «my.test.package» Ошибка: не найден идентификатор ресурса для атрибута «identifier» в пакете «my.test.package»

Если я изменю свойпространство имен для чего-то вроде:

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

... ошибки проходят, и все работает, но myId имеет значение null и cds равно 0 (значение по умолчанию!) в конструкторе MyComponent.java.

Я бы сказал, что это какая-то очень основная ошибка, но я не смог ее обнаружить, и поскольку документации по этому вопросу немного, я решил спросить здесь.

Заранее спасибо!

Ответы [ 2 ]

15 голосов
/ 17 марта 2012

Хорошо. Я понял это!

На оригинальный пост у меня было:

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

... но у меня в источнике было:

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

... потому что я думал, что нужно поместить URI в пакет компонентов.

ЭТО НЕПРАВИЛЬНО!

В xmlns это должно быть имя приложения, заявленное в манифесте!

Когда я удалил часть «компонентов» из xmlns, она «соответствовала» имени приложения в манифесте, и ошибки исчезли, и когда я запустил вещь в отладке, я фактически смог увидеть значения, которые я передавал параметрам в XML!

Надеюсь, это поможет кому-то еще! : -)

UPDATE

Позже мне понадобилось перенести элемент управления в библиотеку, и я снова столкнулся с проблемой. Кажется, что когда вы помещаете компонент в библиотеку и используете его в клиентском приложении, вы должны объявить xmlns, как показано ниже:

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

Если вы сделаете это (и объявите библиотеку как зависимость Android), Eclipse (или это Android?) Будет искать зависимости для соответствующих привязок атрибутов.

0 голосов
/ 17 марта 2012

У меня была проблема, подобная этой, оказалось, что она вызывает другой конструктор

Попробуйте использовать конструктор, который принимает параметр defStyle

public MyComponent(Context context, AttributeSet attrs, int defStyle) 
...