2010-07-30 24 views
5

Tôi có một TextView hiển thị văn bản thay đổi và chạy thời gian. Tôi muốn sử dụng phương thức View.getLineCount() để xem có bao nhiêu dòng TextView chiếm và thực hiện các chức năng khác nhau cho phù hợp. Vấn đề là tôi cần phải xác định số lượng các dòng TextView mất trong cùng một phương pháp mà cần phải biết có bao nhiêu dòng nó mất. Tôi đã thử gọi View.invalidate() ở giữa hai cuộc gọi nhưng điều đó dường như không sửa chữa bất cứ điều gì. Tôi muốn đo số dòng mà không hiển thị chế độ xem nếu có thể nhưng nếu tôi phải hiển thị, tôi sẽ mở để thực hiện điều đó. Hãy cho tôi biết nếu điều này không đủ cụ thể và tôi sẽ cố gắng cụ thể hơn. Cảm ơn!Android: Đo Kích thước Chế độ xem trước khi hiển thị

Trả lời

1

Điều này thực sự có thể là một vấn đề thực sự phức tạp trong Android. Nếu bạn cần biết tại thời điểm bạn thiết lập các văn bản (tức là trước khi xem được trả lại hoặc gần được trả lại), bạn chỉ có tùy chọn thực sự là sử dụng StaticLayout. Nếu bạn có thể chờ đợi cho đến gần thời gian render, bạn có thể sử dụng một viewTreeObserver:

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

onGlobalLayout có thể được gọi nhiều lần và đôi khi (vì lý do gì) Tôi đã tìm thấy rằng quan điểm không thực sự đặt ra, vì vậy bạn nên làm một số đăng nhập và xem nếu bạn có thể tìm thấy một cách để đảm bảo rằng bất kỳ kết quả bạn nhận được thực sự có ý nghĩa (tức là một số dòng> 0).

StaticLayouts là giải pháp thay thế phức tạp hơn có thể cung cấp cho bạn kích thước của chế độ xem và số dòng. Họ có thể yêu cầu một số tinh chỉnh để hoạt động bình thường và đảm bảo bạn sử dụng loại sơn đó từ chế độ xem bạn đang cố đo lường:

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

Nếu bạn sẵn sàng (hoặc đã có) TextView phân lớp, bạn có thể ghi đè onSizeChanged hoặc onMeasure và cố gắng lấy số dòng ở đó. Một lần nữa, giống như người quan sát cây xem, đôi khi những người đó có thể được gọi trước khi chế độ xem của bạn thực sự được đo lường, vì vậy bạn có thể phải kiểm tra để đảm bảo bất kỳ giá trị nào bạn nhận được trong các phương thức đó đều hợp lý.

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