2012-02-13 11 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 

をし、実際のコードで:アクティビティ内のビューを追加するときに必要なものthatsの、起こるビューが無効になった後は動作しません

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()を呼び出す試してみてください)。あなたのビューは、おそらく無効化とgetDrawingCache呼び出しの間で再描画されていないので、キャッシュを再構築しませんでした。

+0

いいえ、ところでgetDrawingCacheはbuildDrawingCacheを呼び出します。.. .thi私の夢は私を狂わせる – joecks

関連する問題