Android自定义视图背景覆盖视图内容

时间:2016-11-27 18:30:27

标签: java android android-custom-view

我试图弄清楚为什么设置背景时无法设置背景的Android自定义视图在设置背景时突然停止工作。似乎背景涵盖了设置时添加到视图中的项目。我已将视图代码简化为最低限度,以便重现问题并能够在此处发布代码。自定义视图继承自RelativeLayout,代码如下:

public class TestView extends RelativeLayout {

    private LayoutInflater mInflater;
    private ViewTreeObserver mViewTreeObserber;
    private boolean mInitialized = false;

    public TestView(Context ctx) {
        super(ctx, null);
        initialize(ctx, null, 0);
    }
    public TestView(Context ctx, AttributeSet attrs) {
        super(ctx, attrs);
        initialize(ctx, attrs, 0);
    }
    public TestView(Context ctx, AttributeSet attrs, int defStyle) {
        super(ctx, attrs, defStyle);
        initialize(ctx, attrs, defStyle);
    }
    private void initialize(Context ctx, AttributeSet attrs, int defStyle) {
        mInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mViewTreeObserber = getViewTreeObserver();
        mViewTreeObserber.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (!mInitialized) {
                    mInitialized = true;
                    drawItem();
                }
            }
        });
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawItem();
    }
    private void drawItem() {
        if (!mInitialized) return;
        removeAllViews();
        View item = mInflater.inflate(R.layout.testview_item, null);
        TextView txt = (TextView)item.findViewById(R.id.test_view_item);
        txt.setText("Test View Text");
        txt.setTextColor(Color.BLACK);
        txt.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
        addView(item);
    }
}

项目布局很简单:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal" >
    <TextView
        android:id="@+id/test_view_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:ellipsize="end"
        android:maxLines="1" />
</LinearLayout>

示例应用程序只是在XML中声明自定义视图的两个实例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin">

    <TextView android:text="With Background set"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <com.machado.felipe.TestView
        android:background="@android:color/holo_blue_light"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </com.machado.felipe.TestView>
    <TextView android:text="WithOUT Background set"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <com.machado.felipe.TestView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </com.machado.felipe.TestView>
</LinearLayout>

结果如下图所示:

enter image description here

这让我抓狂!我不习惯在Android中编写自定义视图,这是我尝试解决的其他人的代码!我甚至不知道这是不是应该这样做,因为我正在膨胀视图并将它们添加到RelativeLayout我不认为我应该在onDraw中添加它们,但是从那以后完整的代码正在做更复杂的事情,因为用包装布置多行中的项目,这可能是一种有效的方法......但是,无论如何,我无法弄清楚如何解决这个问题!

0 个答案:

没有答案