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

如何在我的自定义视图中使用标准属性android:text?,android,attributes,custom-controls,Android,Attributes,Custom Controls,我编写了一个自定义视图,它扩展了RelativeLayout。我的视图有文本,所以每次使用自定义视图时,我想使用标准的android:text而不需要指定和而不使用自定义名称空间xmlns:xxx 这是我使用自定义视图的xml: <my.app.StatusBar android:id="@+id/statusBar" android:text="this is the title"/> 但是什么是?在这种情况下(在attr.xml中没有可设置样式的格式)?使用以下

我编写了一个自定义视图,它扩展了
RelativeLayout
。我的视图有文本,所以每次使用自定义视图时,我想使用标准的
android:text
而不需要指定
而不使用自定义名称空间
xmlns:xxx

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

<my.app.StatusBar
    android:id="@+id/statusBar"
    android:text="this is the title"/>
但是什么是
在这种情况下(在attr.xml中没有可设置样式的格式)?

使用以下方法:

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();
}
我希望你有个想法

编辑

另一种方法(通过指定declare styleable但不必声明自定义命名空间)如下所示:

attrs.xml:

<declare-styleable name="MyCustomView">
    <attr name="android:text" />
</declare-styleable>
这似乎是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的详细信息,请参阅。

阅读文档:不是很有用,您能给我更多信息吗?:)省略第二个参数我很困惑,因为我的attrs是AttributeSet,而不是int[]我使用了相同的东西,但它似乎不适用于某些属性,如“textColor”。你知道吗?@pskink你在想什么?一个问题。由于重用的属性不属于自定义视图(在本例中,android:text不属于RelativeLayout),因此在用XML声明自定义视图时,它不会显示在IDE中的“建议”中(在我的示例中,android Studio)。有没有办法让android:text也出现在建议中,这样用户就知道这也是视图中可用的属性?至少在我的android Studio版本(2.2)中,这已经不起作用了。当试图用一个普通的
int
调用
TypedArray
上的
getText(1)
时,检查抱怨:“类型styleable的预期资源”。但是,将
getText()
与类似
R.styleable.MyCustomView\u android\u text
的东西一起使用是可行的。我猜Android Studio变得“更聪明”@sebkur你真的运行了代码吗?如果是,那么
getText()
返回什么?“:”不是有效的资源名称字符。“该死!”萨萨诺斯说。“:”在XML中使用,但对于代码中的资源名称,请使用“\”代替它。看看帖子里的区别。如果原始帖子让人困惑或没有帮助,我会删除它。是的,我理解其中的区别。Android Studio不接受这个名称,因为冒号:(它接受。我现在在我的一个项目中使用了
Android:orientation
。但是,您可能需要确保使用正确的属性名称。有效名称列表列在.@J.Beck中。我得到的错误与您使用冒号时的错误相同
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView);
CharSequence t = a.getText(R.styleable.MyCustomView_android_text);
a.recycle();
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();