2

最近我面临着在 xml 布局中将自定义 xml 参数添加到我的视图中。我知道我应该为此目的使用 attrs.xml 文件,但是......我发现,我可以使用自定义参数而根本没有任何 attrs.xml 文件。有人可以解释一下吗?这是一个错误还是一个有效的案例?

这是我的自定义视图:

public class TestView extends View {

public TestView(final Context context, final AttributeSet attrs) {
    this(context, attrs, 0);
}

public TestView(final Context context, final AttributeSet attrs, final int defStyle) {
    super(context, attrs, defStyle);
    final String scheme = "http://red.com/ui/scheme";
    if (attrs != null) {
        Log.d("TestView", "custom param value: " + attrs.getAttributeValue(scheme, "cutom"));
    }
}

}

这是主要布局:

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

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />

<com.red.ui.TestView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#ffAABBCC"
    red:cutom="customvalue"
    />

 </LinearLayout>

这是一个简单的临时项目,由 Android 向导创建。

4

2 回答 2

4

您添加的自定义属性在 R.java 中不可用我认为制作自定义属性的主要座右铭是在多个地方使用它。但是通过这段代码我们无法完成相同的场景。

这是示例代码 - attrs.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <declare-styleable name="MyLayout">
    <attr name="text" format="string" />
 </declare-styleable>
</resources>

我正在更改 main.xml 以添加 text 属性

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

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    myapp:text="Text String" />

<com.psl.TestView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#ffAABBCC"
    myapp:text="My Special Text String"
    red:cutom="customvalue" />

</LinearLayout>

TestView.java -

public class TestView extends View {

public TestView(final Context context, final AttributeSet attrs) {
this(context, attrs, 0);
}

public TestView(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
final String scheme = "http://red.com/ui/scheme";
if (attrs != null) {
    Log.d("TestView", "custom param value: " + attrs.getAttributeValue(scheme, "cutom"));
}

TypedArray a = context.obtainStyledAttributes(attrs,
        R.styleable.MyLayout);
CharSequence s = a.getString(R.styleable.MyLayout_text);
Log.d("MyTestView", "attrs param value: " + s.toString());
}
}

如果您在 attrs.xml 中创建 attr 后注意到。它随处可见。但是通过自定义命名空间在 xml 本身中定义的 attr 只能通过您必须在任何地方定义的命名空间使用。可能是它的一个错误,因为该属性被添加到一些自定义命名空间而不是应用程序本身。

于 2012-07-19T05:44:24.897 回答
0

这当然不是“错误”。这就是您在 xml 中使用自定义视图的方式。参考这个:http: //developer.android.com/guide/topics/ui/custom-components.html

于 2012-07-19T05:48:42.390 回答