11

LinearLayout在 xml 中设置了宽度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

40

我有一个简单的方法工作。

myLayout = (RelativeLayout) findViewById(R.id.my_layout);
myLayout.post(new Runnable() 
    {

        @Override
        public void run()
        {
            Log.i("TEST", "Layout width : "+ myLayout.getWidth());

        }
    });

下面提到的 Jens Vossnack 的方法效果很好。但是,我发现 GlobalLayoutListener 的 onGlobalLayout() 方法被重复调用,在某些情况下可能不合适。

于 2013-12-10T07:29:53.337 回答
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

如果您查看 for 的值FILL_PARENT(您应该使用MATCH_PARENT,因为FILL_PARENT现在已弃用),您会注意到它的值是 -1。LayoutParams只是您的视图外观的属性。一旦视图膨胀并看起来参数指定的方式,视图不会返回并更改这些参数以反映视图的实际值(宽度/高度/等)。

如果您想获得视图的实际宽度,则必须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(已弃用)。

当你这样做时,你会得到与 at 对应int width=layParamsGet.width;的正确结果。如果你不想得到真正的宽度,你需要等待调用和使用-1fill_parentonMesure()

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

layoutGet.getWidth()应该解决

于 2013-08-06T13:09:28.517 回答