如何在自定义视图中使用标准属性 android: text?

我写了一个扩展 RelativeLayout自定义视图。我的视图有文本,所以我想使用标准的 android:text 没有需要指定一个 <declare-styleable>没有使用自定义名称空间 xmlns:xxx每次我使用我的自定义视图。

这是我使用自定义视图的 xml:

<my.app.StatusBar
android:id="@+id/statusBar"
android:text="this is the title"/>

我如何得到属性值? 我认为我可以得到 android: text 属性

TypedArray a = context.obtainStyledAttributes(attrs,  ???);

但是在这种情况下 ???是什么(在 attr.xml 中没有可设置样式) ?

22987 次浏览

使用:

public YourView(Context context, AttributeSet attrs) {
super(context, attrs);
int[] set = {
android.R.attr.background, // idx 0
android.R.attr.text        // idx 1
};
TypedArray a = context.obtainStyledAttributes(attrs, set);
Drawable d = a.getDrawable(0);
CharSequence t = a.getText(1);
Log.d(TAG, "attrs " + d + " " + t);
a.recycle();
}

我希望你有办法

剪辑

另一种方法(指定可声明样式但不必声明自定义名称空间)如下:

Xml:

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

Java:

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView);
CharSequence t = a.getText(R.styleable.MyCustomView_android_text);
a.recycle();

这似乎是从自定义视图中提取标准属性的通用 Android 方法。

在 Android API 中,他们使用一个内部的 R.styleable 类来提取标准属性,并且似乎没有提供使用 R.styleable 来提取标准属性的其他替代方案。

原文

为了确保从标准组件获得所有属性,应该使用以下方法:

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextView);
CharSequence t = a.getText(R.styleable.TextView_text);
int color = a.getColor(R.styleable.TextView_textColor, context.getResources().getColor(android.R.color.darker_gray)); // or other default color
a.recycle();

如果需要其他标准组件的属性,只需创建另一个 TypedArray。

有关标准组件的可用 TypedArray 的详细信息,请参阅 http://developer.android.com/reference/android/R.styleable.html