2010-07-30 5 views
5

텍스트를 변경하고 실행하는 TextView가 있습니다. View.getLineCount() 메서드를 사용하여 TextView가 사용하는 줄 수를 확인하고 그에 따라 다른 기능을 수행하려고합니다. 문제는 TextView가 얼마나 많은 줄을 차지하는지 알아야하는 동일한 방법으로 줄 수를 결정해야한다는 것입니다. 두 호출 사이에 View.invalidate()를 호출 해봤지만 아무것도 수정하지 않은 것 같습니다. 가능하다면 뷰를 렌더링하지 않고 선의 수를 측정하고 싶습니다. 그러나 렌더링을해야한다면 그렇게 할 수 있습니다. 이것이 충분히 구체적이지 않은 경우 나에게 알려 주면 더 구체적으로하려고 노력할 것입니다. 감사!Android : 렌더링 전에보기 크기 측정

답변

1

이것은 실제로 Android에서 실제로 복잡한 문제 일 수 있습니다. 텍스트를 설정할 때 (즉, 뷰가 렌더링되거나 렌더링되기 전에) 알 필요가 있다면, 실제 옵션은 StaticLayout을 사용하는 것입니다. 그래서,

yourTextView.getViewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout(){ 
     yourTextView.getLineCount(); 
    } 
} 

onGlobalLayout 여러 번 호출 할 수 있습니다 때로는 (어떤 이유) 내가보기 실제로 아직 배치되지 않은 것으로 나타났습니다 : 당신이 가까운 시간을 렌더링 할 때까지 기다릴 수 있다면, 당신은 viewTreeObserver을 사용할 수 있습니다 당신은 어떤 로깅을해야만하고 결과가 무엇이든간에 실제로 이해할 수있는 방법을 찾을 수 있는지 확인해야합니다 (즉, 라인 수가 0보다 큰 경우).

StaticLayouts는보기 크기와 선 수를 줄 수있는 더 복잡한 대안입니다. 그들은 제대로 작동하도록하기 위해 일부 조정을 요구하고, 당신이 측정하려는 뷰에서 페인트를 사용하여 확인 할 수 있습니다,

yourTextView.setText(newText); 
//the last boolean should be true if you're using padding on your view 
StaticLayout measure = new StaticLayout(yourTextView.getText(), yourTextView.getPaint(), 
    maxAvailableWidthForYourTextView, Layout.Alignment.ALIGN_NORMAL, 1.0f, 1.0f, false) 

int numberOfLines = measure.getLineCount(); 
당신이 기꺼이 경우

(또는 이미) 텍스트 뷰를 서브 클래 싱을 onSizeChanged 또는 onMeasure를 오버라이드 (override) 해, 거기에 행수를 취득하려고 할 수 있습니다. 뷰 트리 옵저버와 마찬가지로 뷰가 실제로 측정되기 전에 뷰 트리 관찰자가 호출 될 수 있으므로 이러한 메서드에서 얻는 값이 무엇이든간에 의미가 있는지 확인해야 할 수 있습니다.