安卓:onMeasure错误 - 多次调用

4

我希望得到帮助。我的问题与函数调用onMeasure有关。在我的xml文件中(RelativeLayout),我有三个元素:TextView,RelativeLayout和在其中包含我的类。现在我的主要Activity类和我的子类如下:

  public class MainActivity extends Activity implements OnTouchListener {

    final String LOG_TAG = "myLogs";
    TextView tv1;
UiMyClass uimc;

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    tv1 = (TextView) findViewById(R.id.mytext2);
    tv1.setOnTouchListener(this);
    String str1 = "qwertyy";
    uimc = (UiMyClass) findViewById(R.id.myclass1);
    Log.d(LOG_TAG, "Open1-0" + "   " + str1);       
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    int evX = (int) event.getX();
    int evY = (int) event.getY();
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        tv1.setText("uyq8qyw");
        break;
    case MotionEvent.ACTION_MOVE:
        break;
    case MotionEvent.ACTION_UP:
        break;
    }
    Log.d(LOG_TAG, "Touch_GS");
    return true;
}
}

public class UiMyClass extends View {

final String LOG_TAG = "myLogs";

public UiMyClass(Context context, AttributeSet attrs) {
    super(context, attrs);      
    this.setBackgroundResource(R.drawable.ic_launcher);
    Log.d(LOG_TAG, "Initialization_00");        
}

@Override 
protected void onMeasure(int x, int y) {
    setMeasuredDimension(100, 50);
    Log.d(LOG_TAG, "Measure_02");       
}

}

问题出在哪里?当应用程序启动时,onMeasure被执行了8次(可以从日志中看到)。顺便说一下,如果在其他层中增加我的View元素的包围盒,onMeasure将会执行2 ^(封闭层数量+2)次。(即对于一个是8,对于2是16)接下来,当我按下TextView时,触摸事件被执行,但同时也启动了onMeasure。如何使得onMeasure不再启动,并且总体上只启动一次。提前感谢您的帮助。


每当布局更改或视图重新绘制时,都会调用OnMeasure。 - Raghunandan
1个回答

12
这种情况会在两种情况下发生: - 当您使用LinearLayout并在其中一个子元素上设置layout_weight时。权重属性导致该子元素被测量两次。因此,如果你在内部放置另一个带有权重的LinearLayout,那么叶子子元素将被测量4次。 - 相同的情况也可能发生在RelativeLayout上。一些约束条件可能会导致多个度量通道。
这意味着您应该小心处理权重属性和RelativeLayout。我建议您使用Android的Traceview分析器和Hierarchy Viewer来测量布局的性能。

这就是为什么我要费力地创建自己的布局。这样我就可以把我的视图放在它们应该在的位置上。然而,即使我只有一个视图,onMeasure 也会被调用21次。而且我确保从 ViewGroup 继承。我的担忧是这些不必要的调用会微微地减慢我的应用程序。 - user9599745

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接