Android:如何为自定义小部件定义属性?

时间:2010-05-11 16:54:46

标签: android android-widget

看看Mark Murphy在http://github.com/commonsguy/cw-advandroid/tree/master/Views/ColorMixer/的优秀示例,您可以看到他定义了一个名为ColorMixer的自定义小部件。 ColorMixer在attrs.xml中声明了一个名为“initialColor”的属性。

在ColorMixer的构造函数中,他获取属性值,如下所示:

  TypedArray a=getContext()
      .obtainStyledAttributes(attrs, R.styleable.ColorMixer, 0, 0);

  color = a.getInt(R.styleable.ColorMixer_initialColor, 0xFFA4C639);
  a.recycle();

如果'R'可用于ColorMixer,这可以正常工作。如果使用ColorMixer编写并使用它将成为其中一部分的任何包进行编译,就会出现这种情况。

但是如果我想让ColorMixer更有用呢?我想使用相同的源代码,未经修改,甚至可能将其放入jar文件中。这意味着您无法引用“R”。

在我看来,我应该可以做类似

的事情
TypedArray a=getContext()
          .obtainStyledAttributes(attrs, what-do-I-do-here?, 0, 0);
int resid = context.getResources().getIdentifier("ColorMixer_initialColor",
                 "attr", "com.commonsware.android.colormixer.ColorMixer")
color = a.getInt(resid, 0xFFA4C639);

但是getIdentifier永远不会返回任何东西,只有零。还有什么我应该做的吗?我想重写这段代码完全独立于'R'

有关具体示例的源代码,请参阅www.efalk.org/tmp/CustomWidget.tar.gz

1 个答案:

答案 0 :(得分:2)

  

看看Mark Murphy的优秀例子

:: blushes ::

谢谢!

  

但是,如果我想要ColorMixer,那该怎么办?   更普遍有用吗?

You mean like this

  

我想使用相同的来源,   没有修改,甚至可能把它放进去   一个jar文件。这意味着你无法做到   引用'R'。

这正是我在最近几个小时内开始the Android Parcel Project的原因。

问题有两方面:从字符串表示中获取标识符,并确保这些内容不会与其他可重用的小部件发生冲突。此外,您需要部署这些资源,而这些资源不仅可以隐藏在JAR中。等等。

我有一些helper code(也以包裹形式提供)来处理资源ID的东西。文档很轻,但会在一周内改进。

如果您对所有这些工程的工程原理有其他疑问,请加入cw-android Google Group并在那里加注!