创建自定义复合视图

时间:2012-06-21 15:14:07

标签: android android-layout

我正在尝试创建一个ImageView,其上面有TextView的视图。

我一直试图在此找到任何好的例子,所以我希望有人可以告诉我我做错了什么或在哪里寻找例子。我见过http://developer.android.com/guide/topics/ui/custom-components.html#compound,但只是真正描述了最低要求。

我发现了一些像Creating Compound Controls With Custom XML Attributes这样的东西,但我的设置有点不同。

我的代码在下面,它扩展了LinearLayout,我不确定这是否还有可行的方法。布局中没有显示任何内容。

ImageWithOverlay

public class ImageWithOverlay extends LinearLayout {
    ImageView image;
    TextView text;

    public ImageWithOverlay(Context context) {
        super(context);
        setupDisplay(context);
    }

    public ImageWithOverlay(Context context, AttributeSet attrs) {
        super(context, attrs);
        setupDisplay(context);
    }

    public ImageWithOverlay(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setupDisplay(context);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        image.draw(canvas);
        text.draw(canvas);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {     
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);      
    }

    private void setupDisplay(Context context) {
        image = new ImageView(context);
        image.setImageResource(R.drawable.flowers);
        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        image.setLayoutParams(lp);

        text = new TextView(context);
        text.setText("testing");
        lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        text.setLayoutParams(lp);
    }
}

status.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.package.blah.ImageWithOverlay
        android:id="@+id/imageWithOverlay1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </com.package.blah.ImageWithOverlay>

</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

使用RelativeLayout而不是LinearLayout,这样您就可以将文本放在图像上。

它们没有出现的原因是它们没有使用addView添加,所以在设置每个的LayoutParams之后调用它。

删除onDraw()调用,除非您明确请求,否则不会将其用于ViewGroups。一旦添加了视图,它们将被自动绘制。