如果我在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()); }