为什么onMeasure()在我的自定义视图中调用两次?

以下是我的自定义View代码:

XML布局:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.project.summary" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/BgColor"> <com.project.summary.customview.CustomView android:id="@+id/customView" android:layout_width="wrap_content" android:layout_height="wrap_content" app:colorValue="@color/textRed" app:textString="This the Custom View!!!" app:textSize="20sp" /> </LinearLayout> 

在我的CustomView.java代码:

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Log.e("140117", "onMeasure()"+this.getHeight()+"||"+this.getWidth()); } 

testing活动代码:

  public class CustomViewActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.customview_layout); } } 

logcat输出:

 01-17 13:47:01.203: E/140117(11467): onMeasure()0||0 01-17 13:47:01.243: E/140117(11467): onMeasure()28||212 

我search了StackOverflow,但没有人给出明确的答案。 有人可以帮我吗?

Solutions Collecting From Web of "为什么onMeasure()在我的自定义视图中调用两次?"

一个父视图可以多次调用它的子对象measure()。 例如,父母可以用未指定的维度来测量每个孩子一次,以找出他们想要的大小,如果所有孩子的不受约束的大小之和太大或太小,则用实际数字再次调用measure()也就是说,如果孩子们不同意他们各自得到多less空间,那么父母会介入,并在第二遍设置规则。 作为https://developer.android.com/guide/topics/ui/how-android-draws.html说&#x3002;

在过去,当我有类似这样的麻烦,这是因为我的“onAnAction”代码应该已经在活动的onCreate中的活动的类代码AKA中,而不是在自定义视图的类中。

这可能工作,但不能保证,它通常需要一些摆弄和了解android生命周期。

你在你的问题中错过了什么? 因为如果你重写onMeasure,你必须调用setMeasuredDimension(int,int),否则你会得到一个IllegalStateException。 在你的问题你似乎没有得到任何例外。