web-dev-qa-db-ja.com

Androidフラグメントのレイアウトの高さと幅を取得する

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

_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 ()メソッドにこれらのディメンションが必要です。出来ますか?

19
lory105

これに対するより明確な解決策があります。フラグメントのルートビューで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。

22
Staffan

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(..)
}
10
Udi Oshi

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

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

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

1