1

supportFragmentManager を使用してさまざまなフラグメントを表示するアクティビティがあります。その点についてフラグメントまたは親アクティビティでビューを取得しようとし、画面上の位置を測定しようとすると、フラグメントのライフサイクルの onResume の後、または onActivityCreated/onResume/onAttachedToWindow の後にのみ測定できるようですアクティビティ。通常、約 100 ~ 200 ミリ秒後に使用可能になります。おそらくキャンバス描画イベントのように、ライフサイクルイベントが文書化されている/文書化されていない、またはこれがいつ発生したかを知る確実な方法はありますか? 問題のフラグメントは親アクティビティ ビューを測定する必要がありますが、onResume ですぐに利用できるとは限りません。ハンドラーを 200 ミリ秒待たせるようなハックをしなければならないのは本当に嫌です。

4

1 に答える 1

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
        }
    };
}
于 2016-07-27T22:47:07.690 に答える