扩展View并从Android添加xml属性

时间:2013-07-08 03:30:51

标签: android android-custom-view

我正在开发一个支持Image和Text的Android按钮。这可以使用Button和复合drawable来实现,但这会产生缩放问题。

我希望窗口小部件可以在xml中声明,具有类似的内容

<ImageTextButton
    android:layout_width="wrap_content"
    android:layout_height="50dp"
    android:src="@drawable/my_drawable"
    android:text="@string/my_text"
    android:textSize="12sp" />

这里的问题是:我已经画了按钮,它向右缩放。我的意思是我知道如何获得android:src它似乎工作得很好。但是当我试图让textSize出错时。

我读了这样的属性:

int attrsArray[] = { android.R.attr.src, android.R.attr.textSize };
TypedArray ta = getContext().obtainStyledAttributes(attrs, attrsArray);

for (int i = 0; i < ta.getIndexCount(); i++) {
    switch (i) {
    case 0:
    int srcId = ta.getResourceId(i, 0);
    srcBitmap = BitmapFactory.decodeResource(getResources(), srcId);
    break;
    case 1:
        float textSize = ta.getDimension(i, 0);
    if (textSize > 0) {
        Log.i("IMAGEBUTTON", "SETTING CUSTOM SIZE");
    textPaint.setTextSize(textSize);
    }
    break;
    }
}

但是ta.getIndexCount()它只返回1,所以切换永远不会进入case 1

我做错了什么?是否有必要将我的自定义视图声明为可样式?如果是这种情况,我可以不创建新的命名空间吗?

修改

我解决了我的问题,打电话给super.getTextSize()。这可以假设我继承自TextView。现在我很好,但我想知道为什么我的代码不起作用。如果我不继承TextView并希望添加更多Android属性,该怎么办?

1 个答案:

答案 0 :(得分:0)

我不确定你要做什么,但是在这里的代码中你总是以0开始for循环,所以总是会进入“case 0”,永远不会进入case 1