2013-03-22 6 views
4

나는 도움을 바랍니다. 함수 호출 onMeasure 내 문제가. 내 XML 파일 (RelativeLayput) - 3 요소 : TextView, RelativeLayout 그리고 그들을 내 수업에 포함 시키십시오. 이제 내 주요 활동 클래스와 내 여기 것에 클래스Android : 틀린 onMeasure - 많은 전화

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 회입니다 (로그에 표시됨). 그건 그렇고, 내 요소의 인클로저를 다른 레이어에서 보려면, 측정은 2^(밀폐 된 레이어의 양 + 2) 시간 수행됩니다. (즉, 1 8, 2 - 16) TextView 이벤트를 누르면 onTouch가 수행되지만 onMeasure도 시작됩니다. 어떻게 시작하는 것이 더 이상 이루어지지 않았고, 일반적으로 그것은 단지 한 번 시작되었습니다. 사전에 나는 도움에 감사한다.

+0

레이아웃이 변경되거나보기가 다시 그려 질 때마다 OnMeasure가 호출됩니다. – Raghunandan

답변

11

이러한 종류의 동작은 두 가지 상황에서 발생합니다. - LinearLayout을 사용하고 자식 중 하나에 layout_weight을 설정 한 경우. weight 속성은 해당 하위가 두 번 측정되도록합니다. 따라서 체중이 다른 LinearLayout을 안으로 넣으면 잎 자식에 대해 4 개의 측정 값을 얻습니다. - 같은 일이 RelativeLayout에서 발생할 수 있습니다. 일부 제약 조건으로 인해 여러 번의 측정 패스가 발생할 수 있습니다.

이것은 무게 속성과 RelativeLayout에주의해야 함을 의미합니다. 안드로이드의 트레이스 뷰 프로파일 러와 계층 뷰어를 사용하여 레이아웃의 성능을 측정하는 것이 좋습니다.