将动态视图创建到Canvas时,动态视图创建失败

时间:2012-02-13 16:02:58

标签: android

您好我正在尝试绘制一个复杂的视图,由xml布局定义为Bitmap(之后绘制到画布)。然后,当数据模型中的某些内容发生变化时,该视图会定期更新。 更改静态定义的TextView非常完美,但是将新视图添加到linearLayout无论如何都不起作用。我的错误在哪里?

这就是我添加新视图的方式:

           linearLayoutContainer.removeAllViewsInLayout();

            for (int i = 0 ; i < 5; i ++) {

                TextView child = new TextView(getContext());
                child.setText("example" + i);
                child.setVisibility(View.VISIBLE);
                linearLayoutContainer.addView(child, i , new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT));
                i++;
            }

这就是我创建位图的方法:

    sideBarView.refresh();
    sideBarView.invalidate();
    sideBarBitmap = sideBarView.getDrawingCache();

非常适合更新已经在xml中定义的TextViews,但新添加的视图不可见。

我的xml布局如下:

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="some"
    android:textSize="20dp" />

<LinearLayout
    android:id="@+id/linearLayoutContainer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="0.33"
    android:gravity="center_horizontal" >

<!-- THE CONTAINER -->

</LinearLayout>

<LinearLayout
    android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center"
    android:layout_weight="0.66"
    android:gravity="center"
    android:orientation="horizontal" >

<TextView
    android:id="@+id/TextView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="2dp"
    android:text="20%"
    android:textSize="30dp" />

<TextView
    android:id="@+id/TextView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="3dp"
    android:text="35%"
    android:textSize="30dp" />

</LinearLayout>

2 个答案:

答案 0 :(得分:1)

我解决了我的问题。通过添加新视图刷新我的视图后,我应该再次在根视图上调用measure。这就是我做错了(伪代码):

init code:
created rootView
measure 
getDrawingCache
draw

update code:
update rootView
invalidate rootView
getDrawingCache
draw

所以问题出现在更新代码中,它没有再次调用度量,因此子视图没有被重新测量,当然在活动中添加视图时不会发生这种情况,这就是所需要的:< / p>

update code:
update rootView
measure
invalidate rootView
getDrawingCache
draw

并以实际代码:

private void refreshViews() {

    sideBarView.refresh();

    sideBarView.measure(
            MeasureSpec.getSize(sideBarView.getMeasuredWidth()),
            MeasureSpec.getSize(sideBarView.getMeasuredHeight()));
    sideBarView.layout(0, 0,
            MeasureSpec.getSize(sideBarView.getMeasuredWidth()),
            MeasureSpec.getSize(sideBarView.getMeasuredHeight()));

    sideBarView.invalidate();
    sideBarView.buildDrawingCache();
    sideBarBitmap = sideBarView.getDrawingCache();
}

答案 1 :(得分:0)

尝试在sideBarView.getDrawingCache()之前调用sideBarView.buildDrawingCache()。您的视图可能没有在invalidate和getDrawingCache调用之间重新绘制,因此不会重建其缓存。