gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:24 24 4
gpt4 key购买 nike

我一直在为 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>

ma​​in.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"

...错误继续运行,但 myId 为 null 并且 cds 为 0(默认值!)回到 MyComponent.java 构造函数。

我会说这是一些非常基本的错误,但我无法发现它,而且由于没有太多关于这方面的文档,我决定在这里提问。

提前致谢!

最佳答案

好的。我解决了!

在我原来的帖子上:

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 上,它应该是在 list 上声明的应用程序名称!

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

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

更新

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

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

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

关于Android 自定义控件命名空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9745894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com