在onResume中调用getMeasuredWidth()或getWidth()方法返回0。我认为此时视图尚未绘制。
同时,我认为需要将getMeasuredWidth()或getWidth()方法放入布局绘制完成并且视图测量已知的回调方法中。应该使用哪个Android回调方法?
同时,我认为需要将getMeasuredWidth()或getWidth()方法放入布局绘制完成并且视图测量已知的回调方法中。应该使用哪个Android回调方法?
在系统渲染视图之前(通常是在onCreate
/onResume
中), 无法使用width
/height
/getMeasuredWidth
/getMeasuredHeight
属性获取View
的值。
一个简单的解决方法是将Runnable
发布到布局中。当View
被布置后,该Runnable
将被执行。
BoxesLayout = (RelativeLayout) findViewById(R.id.BoxesLinearLayout);
BoxesLayout.post(new Runnable() {
@Override
public void run() {
int w = BoxesLayout.getMeasuredWidth();
int h = BoxesLayout.getMeasuredHeight();
...
}
});
这个答案说:
使用 ViewTreeObserver
监听 View
,等待第一次布局完成。只有在第一次布局完成后,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();
}
});
}
实际上,如果布局没有显示在屏幕上,getWidth()方法返回0。对我而言有效的方法是在调用getMeasuredWidth()或getMeasuredHeight()之前调用measure()方法。对于measure方法,我使用了Layout.WRAP_CONTENT参数来获取布局包含内容的测量值。
希望这可以帮到你, Mihai
更简单的方法:
view.post(new Runnable() {
public void run() {
view.getWidth();
}
}
);
http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)
解决方案 #1: 要实现动态方式,您需要使用标签。 标签基本上是视图拥有记忆的一种方式。 因此,请将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;
}
<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());
}
ViewTreeObserver
这种方法,但这种方式简单多了! - JohnnyLambada