2013-01-05 4 views
17

알 수없는 최대 높이를 가진 TextView이 있는데, 이는 장치의 DPI/화면 해상도에 따라 다릅니다. 예를 들어, on 및 MDPI 장치의 경우이 최대 높이를 사용하면 한 번에 2 줄만 표시 할 수 있습니다.이 값은 정의되지 않은 숫자까지 증가 할 수 있습니다.임의의 최대 높이를 가진 여러 줄 TextView에 대해 엘립 스크린이 제대로 작동하지 않습니다.

내 문제는 줄임표 기능과 관련이 있습니다. 어떤 장치가 4 줄을 표시 할 수 있다고 가정 해 봅시다. 수동으로 최대 줄 수를 설정하면 ...

<TextView 
    android:id="@+id/some_id" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:ellipsize="end" 
    android:maxLines="4" 
    android:singleLine="false" 
    android:layout_weight="1" 
    android:gravity="center_vertical" 
    android:text="This is some really really really really really long text" 
    android:textSize="15sp" /> 

... 모두 정상적으로 작동합니다. ,

This is some 
really really 
really really 
really long... 

하지만 오히려 정적 변수로 줄 수를 설정하지 것 : 텍스트가 제대로 맞지 않는 경우, 줄임표는 다음과 같이, 네 번째 줄의 끝에 추가됩니다 DPI/화면 해상도의 조합에 대한 지원을 포함하기를 원합니다. 나는 약간 TextView 크기를 늘리면

This is some 
really really 
really really 
really long 

, 나는 텍스트의 나머지는 여전히 볼 수 있습니다 : 나는 maxLines을 제거한다면 생략은 더 이상 제대로 대신 텍스트의 불완전한 부분을 보여 줄 사에 표시되지 않습니다 다른 뒤에 "그려진"Views. 변수 maxHeight 설정이 작동하지 않는 것 같습니다.

정말이 문제에 대한 해결책을 찾을 수 없습니다. 어떤 아이디어? 도움이된다면 Android v4.0.3 이상 (API 레벨 15)에서만 작업하고 있습니다.

답변

27

TextView에 맞는 줄 수를 TextView#getHeight()TextView#getLineHeight()으로 계산합니다. 그런 다음 TextView#setMaxLines()으로 전화하십시오.

ViewTreeObserver observer = textView.getViewTreeObserver(); 
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     int maxLines = (int) textView.getHeight() 
       /textView.getLineHeight(); 
     textView.setMaxLines(maxLines); 
     textView.getViewTreeObserver().removeGlobalOnLayoutListener(
       this); 
    } 
}); 
+0

완벽하게 작동합니다. 고마워요! – DPR

+0

신기한! 나의 날을 구했다! – Roman

+2

참고 : 선 높이가 다를 수 있습니다! 그리고 getLineHeight 메서드는 항상 예상대로 작동하지 않습니다. 예를 들어 spannables를 사용하여 텍스트의 특정 부분에서 글꼴 크기를 크게 만들 때 발생할 수 있습니다. –