Android:获取Layout的宽度,在其xml中使用fill_parent

我有一个宽度设置为fill_parent宽度的LinearLayout ,现在我需要在运行时编程的宽度。 所以我这样做了:

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

但是debugging的width值被发现为-1 ,任何人有想法为什么我不能在运行时得到在layout xml中设置fill_parent的LinearLayout的确切宽度。

Solutions Collecting From Web of "Android:获取Layout的宽度,在其xml中使用fill_parent"

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

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

 myLayout = (RelativeLayout) findViewById(R.id.my_layout); myLayout.post(new Runnable() { @Override public void run() { Log.i("TEST", "Layout width : "+ myLayout.getWidth()); } }); 

你可以试着听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是你想要获得宽度的视图)

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

如果你想获得视图的实际宽度,那么一旦布局已经膨胀并显示,你将不得不在视图上调用getWidth() 。 在布局显示之前调用getWidth()将会导致0。

 LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); int width = layoutGet.getWidth(); 

layoutGet.getWidth()应该解决

首先,你应该使用match_parent而不是fill_parent (不build议使用)。

当你做int width=layParamsGet.width; ,你得到正确的结果,这是在fill_parent对应的-1 。 如果你不能得到真正的宽度,你需要等待onMesure()调用和使用

 LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); int width = layoutGet. getMeasuredHeight();