2013-01-17 15 views
16

Próbuję określić wysokość TextViewprzed to jest rysowane. Używam następujący kod, aby to zrobić:getMeasuredHeight() z TextView z owiniętym tekstem

TextView textView = (TextView) findViewById(R.id.textview); 
textView.setText("TEST"); 
int widthSpec = MeasureSpec.makeMeasureSpec(LayoutParams.MATCH_PARENT, MeasureSpec.EXACTLY); 
int heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 
textView.measure(widthSpec, heightSpec); 
System.out.println("MeasuredHeight: " + textView.getMeasuredHeight()); 

Wyjście jest MeasuredHeight: 28. Nic w tym złego.

Jednak, gdy daję TextView długi tekst, więc owijania występuje, to nadal daje wysokość jednej linii zamiast dwóch:

(...) 
textView.setText("TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST"); 
(...) 

Wyjście jest MeasuredHeight: 28, gdzie spodziewałbym MeasuredHeight: 56 .

Dlaczego nie daje mi właściwej wartości i jak mogę osiągnąć odpowiednią wartość?

+0

Może [to] [1] pomoże, to prawie ten sam problem! [1]: http://stackoverflow.com/questions/6157652/android-getmeasuredheight-returns-wrong-values ​​ – ObAt

+0

Próbowałem proponowanych rozwiązań w tym wątku, w tym jednym (http: // stackoverflow .com/questions/4668939/viewgrouptextview-getmeasuredheight-gives-wrong-value-is-smaller-than-real), ale mają ten sam rezultat. – nhaarman

+0

Gdzie dokładnie użyłeś tego kodu? – Luksprog

Odpowiedz

9

To jest metoda onCreate. Twoja cała hierarchia widoków nie jest jeszcze mierzona i układana. Tak więc rodzic textView nie zna swojej szerokości. Właśnie dlatego wymiary textView nie są ograniczone przez jego wymiary.

Spróbuj zmienić linię:

int widthSpec = MeasureSpec.makeMeasureSpec(200, MeasureSpec.EXACTLY); 

więc dokonać szerokość TextView wynosi 200 pikseli.

Jeśli wyjaśnisz, dlaczego potrzebujesz wysokości widoku tekstu, być może będziemy w stanie Ci pomóc.

+0

Teraz to daje wysokość> 28, ale oczywiście 'TextView' nie ma szerokości 200px. – nhaarman

+1

Potrzebuję znać wysokość "TextView", aby utworzyć rozwijającą się animację. W szczególności rozwijam 'ViewGroup', która zawiera wiele komponentów. Do animacji muszę znać wysokość, do której animuję. Początkowo 'ViewGroup' to' GONE', ustawiam wysokość na '0', ustawię widoczność na' VISIBLE' i stopniowo zwiększam wysokość do zmierzonej wysokości. – nhaarman

+0

@Niek: Czy znasz dostępną szerokość dla 'TextView'? Czy może pasuje do szerokości okna? –

4

Tak, ostatnio wpadłem na ten sam. Najlepszym sposobem jest utworzenie obiektu ViewTreeObserver i zarejestrowanie obiektu ViewTreeObserver.OnGlobalLayoutListener. Zostanie on wywołany po fazie układania i przed fazą losowania. W tym momencie będziesz mógł uzyskać rozmiar swojego TextView.

Nie będzie to ściśle rzecz biorąc tekst, ale cały tekst. Jeśli jest to wewnętrzne dopełnienie, rzeczywisty tekst będzie mniejszy niż TextView.

Jeśli naprawdę potrzebujesz wymiarów faktycznego tekstu, użyj textView.getLayout(), aby uzyskać obiekt Layout dla tekstu, a następnie użyj layout.getHeight().

+0

Nie mogę używać 'OnGlobalLayoutListener' z różnych powodów.Po pierwsze, muszę zmierzyć wysokość "TextView", który ma widoczność "GONE" w losowym punkcie czasu po narysowaniu reszty układu. – nhaarman

0

Musisz utworzyć niestandardowy TextView i używać go w swoich układach i używać getActual funkcję wysokość ustawić wysokość przy starcie

public class TextViewHeightPlus extends TextView { 
    private static final String TAG = "TextViewHeightPlus"; 
    private int actualHeight=0; 


    public int getActualHeight() { 
     return actualHeight; 
    } 

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

    public TextViewHeightPlus(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setCustomFont(context, attrs); 
    } 

    public TextViewHeightPlus(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     actualHeight=0; 

     actualHeight=(int) ((getLineCount()-1)*getTextSize()); 

    } 

} 
+0

Dlaczego "-1" tam jest? –

Powiązane problemy