3

フラグメントがあり、画面上のビューの位置/幅/高さを測定し、他のクラスに渡す必要があります。

だから私が持っているのは、それを行う関数、次のようなものです:

private void measureTest(){
    v = ourView.findViewById(R.id.someTextField);
    v.getLocationOnScreen(loc);
    int w = v.getWidth();
    ...
    SomeClass.passLocation(loc,w);
    ...

問題は、フラグメントのライフサイクル内でビューの位置/幅/高さが準備できていないことです。したがって、これらのライフサイクル メソッド内でその関数を実行すると、次のようになります。

onCreateView
onViewCreated
onStart
onResume

位置と幅/高さの測定値が間違っているか、値が 0 になっています。私が見つけた唯一の解決策は、GlobalLayoutListenerこのようなものをmainViewに追加することです

mainView.getViewTreeObserver().addOnGlobalLayoutListener(new     ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
    if(alreadyMeasured)
        mainView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    else
        measureTest();
}
});

これで仕事は完了です..しかし、それはただのヤックです!IMO。

これを行うより良い方法はありますか?基本的なことのようです

4

2 に答える 2

6

フラグメント内onActivityCreatedで currentView を取得し ( を使用getView())、ランナブルをそのキューに投稿します。実行可能な呼び出しの内部measureTest()

于 2013-06-05T09:41:12.047 に答える
1

これ以上の方法はありません。そのコードはそれほど悪くありません!ビューがレイアウトされるとすぐに起動されます (私の用語は少し変かもしれません)。これは測定の直後に発生します。これは、Google の Android ドキュメントのBitmapFun サンプル(ImageGridFragment の 120 行目を参照)で行われている方法です。その特定のコード部分には、次のようなコメントがあります。

 // This listener is used to get the final width of the GridView and then calculate the
 // number of columns and the width of each column. The width of each column is variable
 // as the GridView has stretchMode=columnWidth. The column width is used to set the height
 // of each view so we get nice square thumbnails.
于 2013-06-05T09:47:37.893 に答える