私はフラグメントに取り組んでおり、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 ()
メソッドにこれらのディメンションが必要です。出来ますか?
これに対するより明確な解決策があります。フラグメントのルートビューで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。
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(..)
}
onActivityCreated
では、ビューはまだ測定されていません。
いいえ、そこから測定値を取得することはできません。 onGlobalLayout
はそのための良い場所です。レイアウトは測定直後に行われます。
一度だけやりたい場合は、後でリスナーを削除できます。ただし、レイアウトによってサイズが変わる場合があります(たとえば、ソフトキーボードが表示されます)。