71

我写了一个扩展的自定义视图RelativeLayout。我的视图有文本,所以我想使用标准android:text 而不需要指定 a<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 中没有样式)?

4

2 回答 2

109

用这个:

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();
}

我希望你有个主意

于 2013-08-02T10:51:08.957 回答
47

编辑

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

attrs.xml:

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

MyCustomView.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。

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

于 2015-10-08T11:24:59.410 回答