0

私は、supportFragmentManagerを使用してさまざまなフラグメントを表示するActivityを持っています。その問題のフラグメントまたは親アクティビティーのビューを取得しようとしたときに、そのフラグメントのライフ・サイクルまたはonActivityCreated/onResume/onAttachedToWindowのonResumeの後のある時点で測定可能なように見えますアクティビティ。通常、約100〜200ms後に利用可能です。多分キャンバスの描画イベントのように、いつライフサイクルイベントが文書化されているか、文書化されていないか、これがいつ発生したかを知る方法がありますか?問題のフラグメントは、親アクティビティビューを測定する必要がありますが、すぐにonResumeで利用できるとは限りません。ハンドラを200ms待つような何らかのハックをしなければならないのは本当に嫌です。サポート中の場合フラグメントのライフサイクルはすべてのビューが実際に画面に表示されますか?

答えて

1

ViewTreeObserver.addOnGlobalLayoutListener()を使用できます。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    //... 
    someView.getViewTreeObserver().addOnGlobalLayoutListener(getOnLayoutListener(someView)); 
    //... 
} 

private ViewTreeObserver.OnGlobalLayoutListener getOnLayoutListener(final View unHookView) { 
    return new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) 
       unHookView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      else 
       unHookView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      //YOUR CODE HERE 
     } 
    }; 
} 
+0

これを行うでしょう。 Tks。 –

+0

本当に閉じると、リスナーは、私がアクティビティビューを見ているので、onDestroyで中止するonPartおよび/またはonDetachのフラグメントを削除しても、リスナーはそのフラグメントに残っているように思えます。それをさらに見なければならない。ビューの情報は、フラグメント内のビューで使用できます。 :) –

+0

@PeterBirdsリスナーは 'onGlobalLayout'メソッドの中でただ削除されています。そのため、レイアウトが完了した後に削除されます。素早いフラグメントの追加と削除を伴う競合状態に直面している場合、 'YourFragment.this.isAdded()'という条件を使用して 'onGlobalLayout()'の中にフラグメントがまだ追加されているかどうかを確認できます。 – Gero

関連する問題