如何在java和xml中传递自定义组件参数

在android中创build自定义组件时,经常会问如何创build并通过attrs属性传递给构造函数。

通常build议,当在java中创build一个组件时,你只需使用默认的构造函数即

new MyComponent(context); 

而不是尝试创build一个attrs对象,以传递到基于xml的自定义组件中常见的重载构造函数。 我试图创build一个attrs对象,它看起来不是很容易或者根本不可能(没有一个非常复杂的过程),所有帐户都不是真正需要的。

我的问题是:在java中构build自定义组件的最有效方式是传递或设置当使用xml使组件膨胀时attrs对象设置的属性?

(完全披露:这个问题是创build自定义视图的分支)

你可以创build超过从Viewinheritance的三个标准的构造函数,添加你想要的属性…

 MyComponent(Context context, String foo) { super(context); // Do something with foo } 

…但我不推荐它。 遵循与其他组件相同的约定更好。 这将使您的组件尽可能灵活,并且会阻止开发人员使用您的组件,因为您的组件不符合其他所有组件:

1.为每个属性提供getter和setter:

 public void setFoo(String new_foo) { ... } public String getFoo() { ... } 

2.定义res/values/attrs.xml的属性,以便在XML中使用它们。

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

3.从View提供三个标准的构造函数。

如果你需要从一个带AttributeSet的构造函数中select任何AttributeSet ,你可以这样做:

 TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MyComponent); CharSequence foo_cs = arr.getString(R.styleable.MyComponent_foo); if (foo_cs != null) { // Do something with foo_cs.toString() } arr.recycle(); // Do this when done. 

完成所有工作后,您可以MyCompnent编程实例化MyCompnent

 MyComponent c = new MyComponent(context); c.setFoo("Bar"); 

…或通过XML:

 <!-- res/layout/MyActivity.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:blrfl="http://schemas.android.com/apk/res-auto" ...etc... > <com.blrfl.MyComponent android:id="@+id/customid" android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" blrfl:foo="bar" blrfl:quux="bletch" /> </LinearLayout>