我一直在研究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构造函数。
我说这是一个非常基本的错误,但我无法发现它,因为没有太多的文件,我决定在这里问。
提前致谢!
答案 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)