2011-01-24 4 views
4

특정 글꼴 및 크기의 특정 텍스트 문자열에 대해 텍스트 뷰에서 설정할 수있는 텍스트의 양 스크롤해야합니다. 나는 스크롤 할 필요없이 얼마나 많은 텍스트가 TextView 안에 들어갈 수 있는지를 의미합니다. 이것은 How do I determine how much text will fit in a TextView in Android?과 유사하지만 작동하는 해결책을 찾을 수 없습니다. 도와주세요.스크롤 할 필요가 없도록 TextView에 얼마만큼의 텍스트를 설정할 수 있습니까?

답변

1

다른 옵션을 이미 찾았으므로 쉬운 방법이 없다고 가정하면 이론적 인 (아직 테스트하지 않은) hackish 접근 방식이 효과적 일 수 있습니다.

TextView를 확장하는 새 클래스를 만듭니다. 그런 다음 TextView의 내용이 업데이트 된 후에 호출 할 메서드를 재정의합니다. 사용할 방법이 더 있지만이 예제에서는 onDraw()를 사용해 보겠습니다. 이 메서드는 너비를 확인하고 스크롤 할 수 있어야하는지 확인합니다. 그렇다면 문자열을 자르고 텍스트를 설정합니다. 더 이상 스크롤 할 필요가 없을 때까지 루프에서이 작업을 수행합니다.

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    if(getWidth() < computeHorizontalScrollRange()){ 
     // Requires scrolling, the string is too long 

     // Do whatever you need to do to trim the string, you could also grab the remaining string and do something with it. 

     // Set the TextView to use the trimmed string. 
    } 

} 

무한 루프가 발생하지 않았는지 확인하고 너비가 0인지 확인해야합니다.

다양한 android:ellipsize 옵션을 볼 수도 있습니다.

+0

작동합니다. 폭 대신 높이를 사용했습니다. 그러나 여전히 더 나은 대답을 찾고 있습니다. 결국 텍스트를 여러 번 변경하는 것이 최선의 방법은 아닙니다. –

+0

음, 메서드에 문제가 있습니다. 단어 경계에 클립 할 수 없습니다. –

0

이는 그냥 내 빠른 두뇌 폭풍 : 문자

  1. 측정 텍스트 길이
  2. 가져 오기 화면 크기 및 밀도 정보
  3. 이의 대략적인 양을 계산 글꼴 크기, 줄 높이를 가져옵니다 주어진 문자열이 위의 데이터에서 주어진 공간을 차지합니다.
  4. 따라서 문자열을 나눕니다.
+0

어떻게 그 질문, 당신이 질문을 보면, 나는 이미 당신과 같은 다른 질문 링크에서 제안 된 방법을 시도했습니다. –

0

측정 된 높이가 computeHorizontalScrollRange()보다 큰 경우 TextView 클래스를 확장하고 onLayout() 메서드를 재정 의하여 문자열을 자릅니다.

나는 때문에 솔루션은 조금 더 생각 : (뷰가 생성 될 때) 그것은 한 번만 텍스트 트림

  1. ;
  2. "트림 된"텍스트를 나중에 복원하려는 경우 쉽게 저장할 수 있습니다.
  3. OOP는 멋지다.
+0

아직 시도하지는 않았지만 제대로 작동하지 않을 것이라고 생각합니다. 정확한 크기가 어떻게 다듬어 지는지 알기 때문입니다.레이아웃 메서드는 한 번만 호출됩니다. –

+0

트리머가 될 정확한 크기를 찾을 수 없습니다. 올바른 크기가 될 때까지 반복합니다. – goncalossilva

1

나는 실제로 비슷한 것을 필요로했다. 나는 TextView 너비의 반 고정 크기가 필요했지만 텍스트는 항상 거기에 들어가야했습니다. 크기가 중요하지 않기 때문에 필자는 텍스트 크기가 변경 될 때까지 텍스트 크기를 변경하는보기를 만들었습니다.

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.TypedValue; 
import android.widget.TextView; 

/** 
* The text inside this TextView will resize to fit. 
* It will resize until it fits within the view and padding 
*/ 
public class FitTextView extends TextView { 
private float defaultSize = 12; 

public FitTextView(Context context) { 
    super(context); 
} 

public FitTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    defaultSize = getTextSize(); 
} 

public FitTextView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    defaultSize = getTextSize(); 
} 

/** 
* Set the default size. This size is set every time the 
* view is resized. 
* @param size 
*/ 
public void setDefaultSize(float size) { 
    defaultSize = size; 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    setTextSize(TypedValue.COMPLEX_UNIT_PX, defaultSize); 
    fitCharsInView(); 

    super.onSizeChanged(w, h, oldw, oldh); 
} 

@Override 
public void setText(CharSequence text, BufferType type) { 
    fitCharsInView(); 
    super.setText(text, type); 
} 

/** 
* Decreases the text size until it fits inside the view 
*/ 
public void fitCharsInView() { 
    int padding = getPaddingLeft() + getPaddingRight(); 
    int viewWidth = getWidth() - padding; 
    float textWidth = getTextWidth(); 

    int iKillInfite = 0; 
    int maxIteration = 10000; 
    while(textWidth > viewWidth && iKillInfite < maxIteration) { 
     iKillInfite++; 
     float textSize = getTextSize(); 

     setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize-1); 
     textWidth = getTextWidth(); 
    } 
} 

/** 
* Gets the width in pixels of the text 
* @return 
*/ 
private float getTextWidth() { 
    return getPaint().measureText(getText().toString()); 
} 
} 
관련 문제