gpt4 book ai didi

xml - 使用 XML 声明一个自定义的 android UI 元素

转载 作者:IT老高 更新时间:2023-10-28 12:48:54 25 4
gpt4 key购买 nike

如何使用 XML 声明 Android UI 元素?

最佳答案

Android 开发人员指南中有一个名为 Building Custom Components 的部分.不幸的是,the discussion of XML attributes仅涵盖在布局文件中声明控件,而不是实际处理类初始化中的值。步骤如下:

1。在 values\attrs.xml

中声明属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyCustomView">
<attr name="android:text"/>
<attr name="android:textColor"/>
<attr name="extraInformation" format="string" />
</declare-styleable>
</resources>

注意在 declare-styleable 标记中使用了非限定名称。 extraInformation 等非标准 android 属性需要声明其类型。在父类(super class)中声明的标签将在子类中可用,无需重新声明。

2。创建构造函数

由于有两个构造函数使用 AttributeSet 进行初始化,因此可以方便地创建一个单独的初始化方法供构造函数调用。

private void init(AttributeSet attrs) { 
TypedArray a=getContext().obtainStyledAttributes(
attrs,
R.styleable.MyCustomView);

//Use a
Log.i("test",a.getString(
R.styleable.MyCustomView_android_text));
Log.i("test",""+a.getColor(
R.styleable.MyCustomView_android_textColor, Color.BLACK));
Log.i("test",a.getString(
R.styleable.MyCustomView_extraInformation));

//Don't forget this
a.recycle();
}

R.styleable.MyCustomView 是一个自动生成的 int[] 资源,其中每个元素都是属性的 ID。通过将属性名称附加到元素名称来为 XML 中的每个属性生成属性。例如,R.styleable.MyCustomView_android_text 包含 MyCustomViewandroid_text 属性。然后可以使用各种 get 函数从 TypedArray 中检索属性。如果 XML 中定义的属性没有定义,则返回 null。当然,如果返回类型是原始类型,则返回第二个参数。

如果您不想检索所有属性,可以手动创建此数组。标准android属性的ID包含在android.R.attr中,而属性为这个项目在 R.attr.

int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor};

请注意,根据 this thread,您应该android.R.styleable 中使用任何内容将来可能会改变。它仍然在文档中,因为在一个地方查看所有这些常量很有用。

3。在 layout\main.xml

等布局文件中使用它

在顶级 xml 元素中包含命名空间声明 xmlns:app="http://schemas.android.com/apk/res-auto"。命名空间提供了一种避免在不同模式使用相同元素名称时有时会发生冲突的方法(参见 this article 了解更多信息)。 URL 只是一种唯一标识模式的方式 - nothing actually needs to be hosted at that URL .如果这似乎没有做任何事情,那是因为您实际上不需要添加命名空间前缀,除非您需要解决冲突。

<com.mycompany.projectname.MyCustomView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:text="Test text"
android:textColor="#FFFFFF"
app:extraInformation="My extra information"
/>

使用完全限定名称引用自定义 View 。

Android LabelView 示例

如果您想要一个完整的示例,请查看 android 标签 View 示例。

LabelView.java

 TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
CharSequences=a.getString(R.styleable.LabelView_text);

attrs.xml

<declare-styleable name="LabelView">
<attr name="text"format="string"/>
<attr name="textColor"format="color"/>
<attr name="textSize"format="dimension"/>
</declare-styleable>

custom_view_1.xml

<com.example.android.apis.view.LabelView
android:background="@drawable/blue"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
app:text="Blue" app:textSize="20dp"/>

这包含在具有命名空间属性的 LinearLayout 中:xmlns:app="http://schemas.android.com/apk/res-auto"

链接

关于xml - 使用 XML 声明一个自定义的 android UI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2695646/

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