小编典典

定义自定义属性

all

我需要实现自己的属性,例如com.android.R.attr

在官方文档中找不到任何内容,因此我需要有关如何定义这些属性以及如何从我的代码中使用它们的信息。


阅读 127

收藏
2022-03-11

共1个答案

小编典典

目前最好的文档是源。您可以在此处查看它
(attrs.xml)

您可以在顶部<resources>元素或元素内部定义属性<declare-styleable>。如果我要在多个地方使用
attr,我将它放在根元素中。请注意,所有属性共享相同的全局命名空间。这意味着即使您在<declare- styleable>元素内部创建了一个新属性,它也可以在元素外部使用,并且您不能创建另一个具有不同类型的相同名称的属性。

一个<attr>元素有两个 xml 属性nameformat.
name让您称其为某事,这就是您最终在代码中引用它的方式,例如R.attr.my_attribute.
format属性可以具有不同的值,具体取决于您想要的属性的“类型”。

  • reference - 如果它引用另一个资源 id(例如,“@color/my_color”、“@layout/my_layout”)
  • 颜色
  • 布尔值
  • 方面
  • 漂浮
  • 整数
  • 细绳
  • 分数
  • enum - 通常是隐式定义的
  • flag - 通常是隐式定义的

您可以使用 将格式设置为多种类型|,例如format="reference|color".

enum属性可以定义如下:

<attr name="my_enum_attr">
  <enum name="value1" value="1" />
  <enum name="value2" value="2" />
</attr>

flag属性是相似的,除了需要定义值以便它们可以位或在一起:

<attr name="my_flag_attr">
  <flag name="fuzzy" value="0x01" />
  <flag name="cold" value="0x02" />
</attr>

除了属性,还有<declare- styleable>元素。这允许您定义自定义视图可以使用的属性。你可以通过指定一个<attr>元素来做到这一点,如果它之前定义过,你不指定format.
如果您希望重用一个 android attr,例如 android:gravity,那么您可以在 中执行此操作name,如下所示。

自定义视图的示例<declare-styleable>

<declare-styleable name="MyCustomView">
  <attr name="my_custom_attribute" />
  <attr name="android:gravity" />
</declare-styleable>

在自定义视图上以 XML
定义自定义属性时,您需要做一些事情。首先,您必须声明一个命名空间来查找您的属性。您在根布局元素上执行此操作。通常只有xmlns:android="http://schemas.android.com/apk/res/android".
您现在还必须添加xmlns:whatever="http://schemas.android.com/apk/res-auto".

例子:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:whatever="http://schemas.android.com/apk/res-auto"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

    <org.example.mypackage.MyCustomView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:gravity="center"
      whatever:my_custom_attribute="Hello, world!" />
</LinearLayout>

最后,要访问该自定义属性,您通常在自定义视图的构造函数中执行以下操作。

public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);

  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyle, 0);

  String str = a.getString(R.styleable.MyCustomView_my_custom_attribute);

  //do something with str

  a.recycle();
}

结束。:)

2022-03-11