Android自定义控件命名空间问题

7

我一直在开发一个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>

当我放置这个的时候,我收到以下错误信息:

错误:在软件包“my.test.package”中找不到属性“cd_number”的资源标识符 错误:在软件包“my.test.package”中找不到属性“identifier”的资源标识符

如果我将命名空间更改为类似于:

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

我尝试修复错误,让程序能够正常运行,但是在MyComponent.java构造函数中,myId为空且cds为0(默认值!)。

我认为这可能是一些非常基本的错误,但我没有发现它。由于文档不多,所以我决定在这里问问。

先感谢您!

2个回答

15

好的,我解决了!

在原始帖子中,我有:

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中的"components"部分时,“匹配”了清单中的应用程序名称,错误消失了,当我在调试中运行该项目时,实际上可以看到我传递给XML参数的值!

希望这对其他人有所帮助! :-)

更新

后来,我需要将控件移动到库中,并再次面临了这个问题。当您将组件放入库中并在客户端应用程序中使用它时,似乎必须像下面这样声明xmlns:

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

如果您这样做了(并在库声明为Android依赖项),Eclipse(或是Android?)将会搜索依赖项以找到相应的属性绑定。


1
做得好,研究得很透彻,并提供了答案。res-auto修复正是我所需要的。 - AlanKley
'res-auto'。太棒了! - darksider474
什么是bgl和myns,我该如何设置它们的名称? - Zar E Ahmer

0

我曾经遇到过类似的问题,结果发现是调用了不同的构造函数

尝试使用带有defStyle参数的构造函数

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

谢谢,triggs。不幸的是,我的问题似乎是另一个。我定义了你建议的构造函数,如果我不改变命名空间,错误仍然存在。如果我改变xmlns,它会表现得相同:新的构造函数从未被调用,myId为null,cds为0,就像以前一样。还有其他想法吗?有人可以帮忙吗? - Diesel Heart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接