Android - 具有自定义属性的自定义 UI

Posted

技术标签:

【中文标题】Android - 具有自定义属性的自定义 UI【英文标题】:Android - custom UI with custom attributes 【发布时间】:2011-11-28 08:06:14 【问题描述】:

我知道可以创建自定义 UI 元素(通过 View 或特定 UI 元素扩展)。但是是否可以为新创建的 UI 元素定义新的属性或属性(我的意思是不是继承的,而是全新的来定义一些我无法使用默认属性或属性处理的特定行为)

例如元素我的自定义元素:

<com.tryout.myCustomElement
   android:layout_
   android:layout_
   android:text="Element..."
   android:myCustomValue=<someValue>
/>

那么是否可以定义MyCustomValue

谢谢

【问题讨论】:

***.com/questions/2695646/… 嘿,这里有一些关于 android 自定义属性的好文章 - amcmobileware.org/android/blog/2016/09/11/custom-attributes 看看我对this相关问题的回答。 【参考方案1】:

是的。简短指南:

1。创建属性 XML

/res/values/attrs.xml 中创建一个新的 XML 文件,包含属性和类型

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <declare-styleable name="MyCustomElement">
        <attr name="distanceExample" format="dimension"/>
    </declare-styleable>
</resources>

基本上,您必须为包含所有自定义属性的视图设置一个&lt;declare-styleable /&gt;(这里只有一个)。我从未找到可能类型的完整列表,因此您需要查看我猜想的来源。我知道的类型是引用(对另一个资源)、颜色、布尔值、维度、浮点数、整数和字符串。它们是不言自明的

2。在布局中使用属性

它的工作方式与您在上面所做的相同,但有一个例外。您的自定义属性需要它自己的 XML 命名空间。

<com.example.yourpackage.MyCustomElement
   xmlns:customNS="http://schemas.android.com/apk/res/com.example.yourpackage"
   android:layout_
   android:layout_
   android:text="Element..."
   customNS:distanceExample="12dp"
   />

非常直接。

3。利用你传递的值

修改自定义视图的构造函数以解析值。

public MyCustomElement(Context context, AttributeSet attrs) 
    super(context, attrs);

    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyCustomElement, 0, 0);
    try 
        distanceExample = ta.getDimension(R.styleable.MyCustomElement_distanceExample, 100.0f);
     finally 
        ta.recycle();
    
    // ...

distanceExample 在此示例中是私有成员变量。 TypedArray 有很多其他的东西来解析其他类型的值。

就是这样。使用 View 中的解析值来修改它,例如在onDraw() 中使用它来相应地改变外观。

【讨论】:

请注意 TypedArray。完成后一定要调用 recycle()。 这里可以找到一个不错的列表github.com/android/platform_frameworks_base/blob/master/core/… IDE(例如eclipse)是否自动完成自定义属性的键/值? 对于 gradle 构建,您应该在声明自定义命名空间时使用 http://schemas.android.com/apk/res-auto 在第 3 步中,您可以简单地使用 String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");,其中 attr 是在构造函数中传递的 AttributeSet,'initialText' 是您的自定义属性名称【参考方案2】:

在您的 res/values 文件夹中创建 attr.xml。在那里你可以定义你的属性:

<declare-styleable name="">
    <attr name="myCustomValue" format="integer/boolean/whatever" />
</declare-styleable>

当你想在你的布局文件中使用它时,你必须添加

xmlns:customname="http://schemas.android.com/apk/res/your.package.name"

然后你可以使用customname:myCustomValue=""的值

【讨论】:

这不是答案,问题是如何以编程方式从 java 更改【参考方案3】:

是的,你可以。只需使用&lt;resource&gt; 标签。 像这样:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>

link from official website

【讨论】:

感谢您的回答。但在资源中,我看到使用默认的“android:”值。我的意思是,我可以有吗? android:phoneNameSelected="true" 作为我的自定义 UI 元素的参数?

以上是关于Android - 具有自定义属性的自定义 UI的主要内容,如果未能解决你的问题,请参考以下文章

Android平台一款UI体验好于NumberPicker的自定义控件NumberPickerView

android:如何使用属性集构造函数实例化我的自定义视图

尝试将来电重定向到android中的自定义UI [关闭]

从自定义适配器获取片段中的 UI 元素 ID

具有客户端验证的自定义数据注释验证属性

具有属性绑定的自定义 UserControl 模板