2011-12-07 7 views
19

onCreate()の後に、私の活動のUIを更新するバックグラウンドスレッドがあります。レイアウトを追加したり、他のレイアウトを変更することができます。アクティビティがいつレイアウトパスを終了するかを知るには?

私は単に自分のアクティビティでレイアウトパスが終了したことを検出し、単に変更または変更されたレイアウトに直接依存する他のビューの位置を手動で更新できるようにしたいと考えています。

今のところ、requestLayout()をトリガーするモディファイ後、わずかな遅延の後、約50-100ミリ秒後に、ジョブを実行するpostDelayed runnableを使用してちょうどHandlerを使用します。

これは機能しますが、明らかに遅延が確認できます。できるだけ早く仕事をしたいと思います。ビューコードでは、測定パスを簡単に検出できますが、アクティビティでこれを直接解決する方法は見つかりません。

答えて

39

GlobalLayoutListenerは、レイアウト完了時にイベントを発生させます。それはあなたのニーズに合っていますか?フィリップ・フィッツシモンズに加えて

View myView=findViewById(R.id.myView); 
    myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       //At this point the layout is complete and the 
       //dimensions of myView and any child views are known. 
      } 
     }); 
1

が正しい答えを、受け入れ、私は誰かがビュー自体にサイズを知る必要がある場合、方法ということも注意します:

protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    // your code here 
} 

を上書きすることができ、レイアウトが通過した後に呼び出されます。

+6

これは間違いありませんが、私は、測定プロセスが反復的に(重みなど)呼び出されるレイアウトでは、これを2回またはさらに頻繁に呼び出すことができると付け加えたいと思います。 – JacksOnF1re

関連する問題