Проблема с пространством имен пользовательского элемента управления Android

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

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

МойКомпонент.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" ошибка: не найден идентификатор ресурса для атрибута "идентификатор" в пакете "my.test.package"

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

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

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

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

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


person Diesel Heart    schedule 16.03.2012    source источник


Ответы (2)


В порядке. Я решил это!

В исходном посте у меня было:

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!

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

ОБНОВЛЕНИЕ

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

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

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

person Diesel Heart    schedule 17.03.2012
comment
Отличная работа по исследованию и предоставлению ответа. res-auto fix - это именно то, что мне было нужно. - person AlanKley; 15.04.2013
comment
«рес-авто». Ты красавица! - person darksider474; 08.05.2014
comment
что такое bgl и myns, как я могу установить это имя - person AndroidGeek; 08.01.2015

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

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

public MyComponent(Context context, AttributeSet attrs, int defStyle) 
person triggs    schedule 17.03.2012
comment
Спасибо, триггс. К сожалению, моя проблема, кажется, в другом. Я определил предложенный вами ctor, и если я не изменю пространство имен, ошибки сохранятся. Если я изменю xmlns, он будет вести себя так же: новый ctor никогда не вызывается, а myId равен нулю, а cds равен 0, как и раньше. Есть идеи? Кто-нибудь? - person Diesel Heart; 17.03.2012