如果我在onResume中调用getMeasuredWidth()或getWidth()进行布局,则它们返回0

如果我在onResume中调用getMeasuredWidth()或getWidth()进行布局,则返回0.我认为这个视图在这一刻还没有绘制。

此外,我认为我需要把getMeasuredWidth()或getWidth()在调用布局后调用的callback方法,视图测量是已知的。 我应该使用什么样的androidcallback方法?

在系统呈现之前,您无法在View上使用width / height / getMeasuredWidth / getMeasuredHeight (通常来自onCreate / onResume )。

简单的解决scheme是将Runnable到布局。 在View已经布置之后,可运行的程序将被执行。

 BoxesLayout = (RelativeLayout) findViewById(R.id.BoxesLinearLayout); BoxesLayout.post(new Runnable() { @Override public void run() { int w = BoxesLayout.getMeasuredWidth(); int h = BoxesLayout.getMeasuredHeight(); ... } }); 

这个答案说:

使用ViewTreeObserver上的ViewTreeObserver等待第一个布局。 只有在第一个布局将getWidth()/getHeight()/getMeasuredWidth()/getMeasuredHeight()工作。

 ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); if (viewTreeObserver.isAlive()) { viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); viewWidth = mediaGallery.getWidth(); viewHeight = mediaGallery.getHeight(); } }); } 

你可以在你的视图中覆盖onLayout() ; 这是由Android使用的位置,每个孩子的视图,所以你可以做的东西,你想在那里super(..)调用。

的确,看起来如果屏幕上没有显示布局,getWidth()方法返回0.在我调用getMeasuredWidth()或getMesuredHeight()之前调用measure()方法。 对于度量方法,我使用了Layout.WRAP_CONTENT参数来测量布局包含的内容。

希望这有助于米海

更简单的方法:

 view.post(new Runnable() { public void run() { view.getWidth(); } } ); 

http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable);

解决scheme#1:要做到这一点dynamic,你需要一个标签。 标签基本上是意见有回忆的一种方式。 所以保存convertView在另一个类(MyTag)。 所以在你的java文件中:

 private LayoutInflater layoutInflater; @Override public View getView(int position, View convertView, ViewGroup parent) { MyTag holder = null; View row = convertView; if (row == null) { //Inflate the view however u can String strInflater = Context.LAYOUT_INFLATER_SERVICE; layoutInflater = (LayoutInflater) context.getSystemService(strInflater); LayoutInflater inflater = ((Activity) context).getLayoutInflater(); row = inflater.inflate(layoutResID, parent, false); holder = new MyTag(); holder.itemName = (TextView) row.findViewById(R.id.example_itemname); holder.icon = (ImageView) row.findViewById(R.id.example_image); holder.button1 = (Button) row.findViewById(R.id.swipe_button1); holder.button2 = (Button) row.findViewById(R.id.swipe_button2); holder.button3 = (Button) row.findViewById(R.id.swipe_button3); row.setTag(holder); } else { holder = (MyTag) row.getTag(); } holder.itemName.setText(itemdata.getItemName()); System.out.println("holder.button3.getMeasuredWidth()= "+ holder.button3.getMeasuredWidth()); System.out.println("holder.button3.getWidth()= "+ holder.button3.getWidth()); return row; } //End of getView() static class MyTag { //It also works if not static TextView itemName; ImageView icon; Button button1; Button button2; Button button3; } 

解决scheme2:硬编码。 预先设定宽度。 包含在res / values / dimens.xml文件中

 <dimen name="your_button_width">50dp</dimen> 

然后在res / layout / your_layout.xml文件中包含

  <Button android:layout_width="@dimen/your_button_width" /> 

然后在你的java文件里面:

 int buttonSize= (int) (context.getResources().getDimension(R.dimen.your_button_width)); 

使用下面的代码:

 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.e("WIDTH",""+view.getWidth()); Log.e("HEIGHT",""+view.getHeight()); }