11

LinearLayoutxml に幅を として設定しましたが、fill_parent実行時にプログラムで幅が必要になりました。だから私はこれをしました:

    LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1);
    LayoutParams layParamsGet= layoutGet.getLayoutParams();
    int width=layParamsGet.width;

しかしwidth、デバッグの値は-1、レイアウト xml に設定された fill_parent を使用して LinearLayout の実行時に正確な幅を取得できない理由を知っている人なら誰でも であることがわかりました。

4

5 に答える 5

5

globalLayout イベントをリッスンして、そこに幅を取得することができます。ビューがレイアウトされる前に幅を取得しようとしているため、おそらく -1 になります。

vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
       //Do it here
       LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1);
       LayoutParams layParamsGet= layoutGet.getLayoutParams();
       int width=layParamsGet.width;
       removeOnGlobalLayoutListener(layoutGet, this); // Assuming layoutGet is the View which you got the ViewTreeObserver from
    }
});

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

(vtoは幅を取得したいビューです)

于 2013-08-06T13:09:37.737 に答える
2

の値を見ると( は非推奨になったため、FILL_PARENT使用する必要があります)、値が -1 であることがわかります。ビューがどのように見えるべきかについての単なる属性です。ビューが膨張し、パラメーターが指定する方法で表示されると、ビューは戻ってビューの実際の値 (幅/高さなど) を反映するようにそれらのパラメーターを変更しません。MATCH_PARENTFILL_PARENTLayoutParams

ビューの実際の幅を取得したい場合はgetWidth()、レイアウトが膨張して表示されたら、ビューを呼び出す必要があります。getWidth()レイアウトが表示される前に呼び出すと、結果は 0 になります。

LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1);
int width = layoutGet.getWidth();
于 2013-08-06T13:09:57.483 に答える
0

まず、match_parent代わりにfill_parent(非推奨) を使用する必要があります。

すると、 に対応するint width=layParamsGet.width;正しい結果が得られます。実際の幅を取得したくない場合は、呼び出しを待って使用する必要があります-1fill_parentonMesure()

LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1);
int width = layoutGet. getMeasuredHeight();
于 2013-08-06T13:15:26.010 に答える