2013-01-17 31 views
16

Tôi đang cố gắng xác định chiều cao của TextViewtrước khi nó được vẽ. Tôi đang sử dụng mã sau để làm điều đó:getMeasuredHeight() của TextView với văn bản được gói

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()); 

Đầu ra là MeasuredHeight: 28. Không có gì sai với điều đó.

Tuy nhiên, khi tôi cung cấp cho các TextView một chuỗi văn bản dài, do đó gói xảy ra, nó vẫn mang lại cho chiều cao của một dòng duy nhất thay vì hai:

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

Đầu ra là MeasuredHeight: 28, nơi tôi mong chờ MeasuredHeight: 56 .

Tại sao nó không cho tôi giá trị phù hợp và làm cách nào tôi có thể đạt được giá trị phù hợp?

+0

lẽ [này] [1] sẽ giúp bạn, nó gần như cùng một vấn đề! [1]: http://stackoverflow.com/questions/6157652/android-getmeasuredheight-returns-wrong-values ​​ – ObAt

+0

Tôi đã thử các giải pháp được đề xuất trong chuỗi đó và trong luồng này (http: // stackoverflow .com/questions/4668939/viewgrouptextview-getmeasuredheight-give-wrong-value-là-nhỏ hơn so với thực), nhưng chúng có cùng kết quả. – nhaarman

+0

Bạn đã sử dụng mã đó ở đâu? – Luksprog

Trả lời

9

Đây là phương thức onCreate. Toàn bộ hệ thống phân cấp chế độ xem của bạn chưa được đo và bố cục. Vì vậy, cha mẹ của textView không biết chiều rộng của nó. Đó là lý do tại sao các dimentions của textView không bị ràng buộc bởi các dimentions của cha mẹ.

Cố gắng thay đổi dòng của bạn để:

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

vì thế nó làm cho chiều rộng TextView của mình bằng 200 pixel.

Nếu bạn giải thích lý do tại sao bạn cần chiều cao của văn bản thì có thể chúng tôi sẽ có thể giúp bạn.

+0

Bây giờ nó có chiều cao> 28, nhưng rõ ràng là 'TextView' không rộng 200px. – nhaarman

+1

Tôi cần biết chiều cao của 'TextView' để tạo hoạt ảnh mở rộng. Đặc biệt, tôi đang mở rộng một 'ViewGroup' chứa nhiều thành phần. Đối với các hình ảnh động tôi cần phải biết chiều cao để animate. Đầu tiên, 'ViewGroup' là' GONE', tôi đặt chiều cao là '0', đặt mức hiển thị thành' VISIBLE' và tăng chiều cao dần dần đến độ cao được đo. – nhaarman

+0

@Niek: Bạn có biết chiều rộng có sẵn cho 'TextView' không? Có lẽ nó phù hợp với chiều rộng cửa sổ? –

4

Vâng, gần đây tôi đã tự mình gặp phải vấn đề này. Cách tốt nhất là tạo đối tượng ViewTreeObserver và đăng ký ViewTreeObserver.OnGlobalLayoutListener. Điều này sẽ được gọi sau giai đoạn bố trí và trước giai đoạn vẽ. Bạn sẽ có thể nhận được kích thước của TextView của bạn tại thời điểm đó.

Điều đó sẽ không nghiêm chỉnh là chính văn bản, nhưng đối với toàn bộ TextView. Nếu có đệm nội bộ liên quan, văn bản thực tế sẽ nhỏ hơn TextView.

Nếu bạn thực sự cần kích thước của văn bản thực tế, hãy sử dụng textView.getLayout() để nhận đối tượng Layout cho văn bản và sau đó sử dụng layout.getHeight().

+0

Tôi không thể sử dụng 'OnGlobalLayoutListener' vì nhiều lý do khác nhau.Đối với một, tôi cần phải đo chiều cao của một 'TextView' có khả năng hiển thị' GONE' tại một điểm ngẫu nhiên trong thời gian sau khi phần còn lại của bố cục được vẽ. – nhaarman

0

Bạn cần phải tạo Custom TextView và sử dụng nó trong bố trí và sử dụng chức năng chiều cao getActual để thiết lập chiều cao trong thời gian chạy

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

Tại sao "-1" trong đó? –

Các vấn đề liên quan