【问题标题】:Why is onMeasure() called twice in my custom View?为什么在我的自定义视图中调用了两次 onMeasure()?
【发布时间】:2014-02-06 08:58:19
【问题描述】:

下面是我的自定义代码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());
}

测试活动代码:

    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

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

【问题讨论】:

  • 这是正常现象。如果你在RelativeLayout,你几乎肯定会被测量两次或更多。
  • @kcoppock:谢谢你的回复,你能告诉我为什么它会调用两次吗?触发器是什么?当设置我的自定义视图权重属性时,onMeasure() 调用了四次!为什么?
  • 看到这个答案:stackoverflow.com/a/4069077/321697
  • @kcoppock:再次感谢,答案只说:“当您嵌套多个使用权重参数的LinearLayout时,布局传递可能会特别昂贵,这需要对孩子进行两次测量。”,但是不解释什么时候使用权重参数,需要给孩子测量两次?

标签: android android-custom-view onmeasure


【解决方案1】:

过去当我遇到类似的问题时,这是因为我的“onAnAction”代码应该在活动的 onCreate 中的活动类代码 AKA 中,而不是在自定义视图的类中。

这可能有效,但不能保证,它通常需要一些摆弄和对 android 生命周期的理解。

【讨论】:

    【解决方案2】:

    父视图可以对其子视图多次调用 measure()。例如,父母可以用未指定的尺寸测量每个孩子一次,以确定他们想要多大,然后如果所有孩子的无约束尺寸的总和太大或太小,则使用实际数字再次调用 measure() (也就是说,如果孩子们在他们各自获得多少空间的问题上没有达成一致,父母将干预并在第二次通过时设置规则)。 正如https://developer.android.com/guide/topics/ui/how-android-draws.html 所说。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这应该是一条评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2012-08-29
      • 1970-01-01
      • 2015-02-02
      • 2020-01-20
      • 2013-10-22
      相关资源
      最近更新 更多