2016-04-17 6 views
0

私のレイアウトでは、4つのカスタムImageViewを含むGridViewがあります。すべてのImageViewが最初にサイズ変更されるまで、GridViewの可視性を不可視に設定していますが、GridViewが表示されても、ImageViewsの短い点滅がまだ変わりません。描画前のビューのサイズ変更

blink for a split second

views are resized in a moment

各ImageViewのは、そのサイズを縮小するために、別のリスナーを作成します。

//Setting new params as half of parent's size and increasing counter 

if (getViewTreeObserver().isAlive()) { 
     final ViewTreeObserver viewTreeObserver = getViewTreeObserver(); 
     viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 
      getViewTreeObserver().removeOnPreDrawListener(this); 

      View parent = (View) getParent(); 
      int dimension = Math.min(parent.getWidth(), parent.getHeight())/2; 
      mThisImageView.setLayoutParams(new AbsListView.LayoutParams(dimension, dimension)); 
      ResizeCounter.setCounter(ResizeCounter.getCounter() + 1); 

      return true; 
     } 
    }); 
} 
//Activity listens to the moment when all ImageViews have been resized 

ResizeCounter.addCounterListener(new OnResizeCounterChangeListener() { 
    @Override 
    public void onResizeCounterChanged() { 
     if (ResizeCounter.getCounter() == 4) { 
      mAnswerGridView.setVisibility(View.VISIBLE); 
     } 
    } 
}); 

私もonGlobalLayout方法でそれらのサイズを変更しようとしました(同じ結果)、onMeasureメソッドをオーバーライドする(親ビューはまだt彼のポイント)。
私はonPreDraw()でビューを変更するには遅すぎると思っていますが、以前に呼び出すことができるメソッドがありますが、すべてのビューが測定されたことを確認できますか?

答えて

1

は、それがAndroid Developers

この意志スケジュールでビューツリーのレイアウトパスを述べていますので、これが原因で動作しない場合がありmAnswerGridView.requestLayout()

mAnswerGridView.setVisibility(View.VISIBLE);前に呼び出すようにしてください。

だから、より良い再レイアウトを強制することがあります。

relayoutChildren(View view) { 
view.measure(
    View.MeasureSpec.makeMeasureSpec(view.getMeasuredWidth(), View.MeasureSpec.EXACTLY), 
    View.MeasureSpec.makeMeasureSpec(view.getMeasuredHeight(), View.MeasureSpec.EXACTLY)); 
view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); } 
+0

私はrequestLayoutを試して、メソッドを無効にしましたが効果はありません。 – tomwyr

+0

私は理由をよく理解していませんが、特定の方法を使って仕事をしました。 requestLayout()はこれらの2つのメソッド(メジャーとレイアウト)を呼び出すべきではありませんか? – tomwyr

+0

はい、それはすべきですが、それはすぐにそのメソッドを呼び出すことはありません – John

1

私はスケジュールが右requestLayoutを呼び出した後に可視性を設定するハンドラを作成しました。
この場合はうまく機能します。

ResizeCounter.addCounterListener(new OnResizeCounterChangeListener() { 
    @Override 
    public void onResizeCounterChanged() { 
     if (ResizeCounter.getCounter() == 4) { 
      mAnswerGridView.requestLayout(); 

      Handler handler = new Handler(); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        mAnswerGridView.setVisibility(View.VISIBLE); 
       } 
      }); 
     } 
    } 
}); 
関連する問題