2012-02-13 65 views
2

嗨我想繪製一個複雜的視圖,由xml佈局定義到一個位圖(後來繪製到畫布)。然後,當數據模型發生變化時,該視圖會定期更新。 更改靜態定義的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> 

回答

1

我解決了我的問題。在通過添加新視圖來刷新我的視圖之後,我應該再次在根視圖上調用度量。這是我做錯了什麼(在僞代碼):

init code: 
created rootView 
measure 
getDrawingCache 
draw 

update code: 
update rootView 
invalidate rootView 
getDrawingCache 
draw 

所以,問題是在更新代碼,再沒有所謂的措施,使孩子的意見沒有被重新測量,這當然不增加一個活動裏面視圖時發生的,所以這就是需要什麼:

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(); 
} 
0

嘗試調用sideBarView.getDrawingCache前sideBarView.buildDrawingCache()()。您的視圖可能沒有在invalidate和getDrawingCache調用之間重新繪製,因此不會重建其緩存。

+0

沒有不工作,順便說一句getDrawingCache調用buildDrawingCache認爲是無效後.. 。THI這個問題讓我瘋狂 – joecks 2012-02-13 16:20:30