Android:错误的onMeasure - 许多电话

时间:2013-03-22 17:15:17

标签: android measure custom-view

我希望得到帮助。函数调用onMeasure我的问题。在My xml中有一个文件(RelativeLayput) - 3个元素:TextView,RelativeLayout并将它们包含在我的类中。     现在我的主要活动类和我的创建类

  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事件时,onTouch被执行,但因此它也是在onMeasure上启动的。如何制作,以便开始onMeasure不再是,并且,一般来说,它只启动了一次。我提前感谢你的帮助。

1 个答案:

答案 0 :(得分:11)

这种行为发生在两种情况: - 当您使用LinearLayout并在其中一个孩子上设置layout_weight时。权重属性导致该孩子被测量两次。因此,如果您将另一个LinearLayout放入体重内,您将获得4个措施。 - RelativeLayout也会发生同样的情况。一些约束可能导致多次测量通过。

这意味着您应该注意权重属性和RelativeLayout。我建议您使用Android的traceview探查器和层次结构查看器来衡量布局的性能。