1

通常のアクティビティでの経験から、onResume()関数でビューに対してアクションを実行でき、それらは既に画面にレンダリングされているという印象を受けました。

ただし、コードの一部を に変換しFragmentonResume()フラグメントの で a を呼び出すとview.getWidth()0 が返されます (ビューは で作成されますonCreateView)。ビューは最終的にレンダリングされますが、フラグメントのライフサイクルでアクセスできないようです。

これは正常ですか?

4

2 に答える 2

2

Fragment がフォアグラウンドに戻ったときに onResume が呼び出されますが、まだ表示されていることや、レイアウトが既に行われていることを保証するものではありません。フラグメントの onResume はそのアクティビティに関連付けられています。ドキュメントからの抜粋を次に示します。

onResume は、アクティビティがユーザーに表示されることを示す最良の指標ではないことに注意してください。キーガードなどのシステムウィンドウが前面にある場合があります。onWindowFocusChanged(boolean) を使用して、アクティビティがユーザーに表示されていることを確認します (たとえば、ゲームを再開するため)。


ビューのサイズを取得する最良の方法は、ViewTreeObserver.OnGlobalLayoutListenerを使用することです。レイアウトが完了すると呼び出され、そこから安全にビューのサイズを取得できます。

関心のあるビューに OnGlobalLayoutListener を登録し、レイアウトが発生したらそのサイズを取得するだけです。値を読み取ったら、リスナーの登録を解除する必要があり、それ以上の更新は気にしません。(それ以外の場合、リスナーは複数回呼び出されます。)

View v = ... ;
...
v.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {

    @SuppressWarnings("deprecation")                                                
    @SuppressLint("NewApi")
    public void onGlobalLayout() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
            v.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        } else {
            v.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }

        height = v.getHeight();
        width = v.getWidth();
    }
});

(互換性チェックに注意してください - メソッドは Jelly Bean で名前が変更されました。)

于 2013-01-08T05:23:27.057 に答える
0

ビューの寸法は、ウィンドウ全体が描画された後にわかります。通常、フラグメントはホスト アクティビティ レイアウトに含まれる子ビューであるため、フラグメントで子ビューが作成されたからといって、それが親のビューにViewGroupまだ追加されているわけではありません。

于 2013-01-07T22:33:32.047 に答える