2012-03-16 56 views
6

我一直在为Android设计一个自定义控件,虽然我试图做什么建议here似乎有什么我做错了。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”

如果我改变我的命名空间是这样的:

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

...错误去W¯¯ ay和东西运行,但myId为null,并且cds为0(默认值!)回到MyComponent.java构造函数上。

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

在此先感谢!

回答

14

好的构造。我解决了它!

在原来的职位我:

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中!

希望这可以帮助别人! :-)

UPDATE

后来我有必要控制进入图书馆,再次面对这个问题。看来,当你把组件库中,并用它在客户端应用程序,您必须声明,如下的xmlns:如果你这样做

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

(并宣布为Android的依赖库)的Eclipse(或者它是Android?)将搜索相应的属性绑定的依赖关系。

+1

伟大的工作研究和提供答案。 res-auto修复正是我所需要的。 – AlanKley 2013-04-15 16:16:01

+0

'res-auto'。你美丽! – darksider474 2014-05-08 09:35:27

+0

什么是bgl和myns,我怎么设定这个名字 – Nepster 2015-01-08 13:01:15

0

我有一个类似的问题,原来它被调用不同的构造函数

尝试与发生在defStyle参数

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

谢谢,触发器。不幸的是我的问题似乎是另一回事。我定义了你建议的ctor,如果我不改变命名空间,错误仍然存​​在。如果我更改xmlns,它将表现相同:新ctor从不调用,myId为空,并且cds与以前一样为0。有什么想法?任何人? – 2012-03-17 09:18:02