Android Custom Control名称空间问题

时间:2012-03-16 23:45:00

标签: android custom-controls attr

我一直在研究Android的自定义控件,虽然我尝试做了here的建议但似乎有些事我做错了。

这是我的代码,看看是否有人能发现问题:

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"

...错误发生并且事情运行但myId为null且cds为0(默认值!)返回MyComponent.java构造函数。

我说这是一个非常基本的错误,但我无法发现它,因为没有太多的文件,我决定在这里问。

提前致谢!

2 个答案:

答案 0 :(得分: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上,它应该是Manifest上声明的应用程序名称。

当我删除xmlns的“components”部分时,它“匹配”Manifest中的应用程序名称,错误消失了,当我在调试中运行该东西时,我实际上可以看到我传递给参数的值XML!

希望这有助于其他人! : - )

<强>更新

后来我需要将控件移动到库中并再次遇到问题。看来,当您将组件放在库中并在客户端应用程序上使用它时,您必须声明xmlns如下:

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

如果您这样做(并将库声明为Android依赖项),Eclipse(或者它是Android?)将搜索依赖项以获取适当的属性绑定。

答案 1 :(得分:0)

我遇到了与此类似的问题,结果发现它正在调用另一个构造函数

尝试使用带有defStyle参数

的构造函数
public MyComponent(Context context, AttributeSet attrs, int defStyle)