21

私はフラグメントに取り組んでおり、にlayout含まれるの次元を取得したいと考えていxml fragment layoutます。コードを試してみると

RelativeLayout myLayout = view.findViewById(R.id.myLayout);
myLayout.getHeight();

0 を返します。myLayout の他のオブジェクト内に配置するには、これらの寸法が必要です。

私は使用しようとします:

myLayout.getViewTreeObserver().addOnGlobalLayoutListener( 
    new ViewTreeObserver.OnGlobalLayoutListener(){

        @Override
        public void onGlobalLayout() {
            mHeight = myLayout.getHeight();  
            mWidth= myLayout.getWidth();
            System.out.println("width: "+mWidth+"   height: "+mHeight);
         }
});

しかし、このコードは何度も呼び出され、いつ実行されるのか正確にはわかりません。これらの寸法が public void onActivityCreated ()メソッドに必要です。出来ますか?

4

3 に答える 3

36

これにはよりクリーンな解決策がありView.post()ます。フラグメントのルート ビューでメソッドを使用するだけで、呼び出しgetMeasuredHeight()/getMeasuredWidth()て実際の値を取得できます。

例えば

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.myfragment, container, false);

    root.post(new Runnable() {
        @Override
        public void run() {
            // for instance
            int height = root.getMeasuredHeight(); 
        }
    });

    return root;
}

非常にきちんと整頓されていて、面倒なことはありませんViewTreeObserver

これは android-23 デバイスでのみテストしましたが、API にはレベル 1 からこのメソッドがありました。

とにかく、WFM。

于 2016-02-25T19:16:47.097 に答える
11

ビューの小さな変更が発生するたびに、 addOnGlobalLayoutListener が呼び出されます。したがって、このリスナーをビューから削除する必要があります。

簡単な使い方:

public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
if (Build.VERSION.SDK_INT < 16) {
    v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
    v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}

}

確認することをお勧めします:

if (myLayout.getHeight()>0 && myLayout.getWidth()>0) {
// Do some code...
removeOnGlobalLayoutListener(..)
}
于 2014-02-09T08:04:05.337 に答える
2

ではonActivityCreated、ビューはまだ測定されていません。

いいえ、そこから測定値を取得することはできません。onGlobalLayoutそれを行うには良い場所です。レイアウトは測定直後に行われます。

一度だけやりたい場合は、後でリスナーを削除できます。ただし、レイアウトはサイズを変更できることに注意してください (たとえば、ソフト キーボードが表示されるなど)。

于 2013-06-05T11:14:45.763 に答える