2013-04-08 40 views
18

Tôi hơi bị kẹt với cái này - đầu tiên và trước hết, liên kết sau hữu ích tuy nhiên tôi đã gặp phải một chút vấn đề với khả năng hiển thị:Xác định xem chế độ xem có trên màn hình hay không - Android

liên kết: Check view visibility

tôi có một cái nhìn cuộn (mẹ) và một số phụ views (LinearLayout ->TableLayout) vv có một số hạng mục tôi thiết lập để View.GONE trong XML (android:visibility="gone").

Tôi có một số mã đơn giản để xác định xem nó có hiển thị hay không bằng cách sử dụng getVisibility() tuy nhiên khi tôi đặt mục thành View.VISIBLE và thử ngay lập tức getDrawingRect() Tôi nhận được Rect với số không trên bảng. Bất kỳ nhấp chuột nào khác đều nhận tọa độ chính xác.

Bây giờ điều này có thể là do chế độ xem chưa bao giờ được vẽ (như được định nghĩa trong XML) khiến nó không trả về tọa độ nào, tuy nhiên tôi đặt View.VISIBLE trước khi cố gắng xác định khả năng hiển thị màn hình. Nó có thể được rằng tôi cần phải nhận được một số loại gọi lại từ nói onDraw()? hoặc có thể đặt chế độ hiển thị chế độ xem của các mục bị ẩn trong mã. Một chút khó chịu; (

Một số mã:

Rect scrollBounds = new Rect(); 
scroll.getHitRect(scrollBounds); 

Rect viewBounds = new Rect(); 

if (view.getVisibility() == View.GONE) { 
    view.setVisibility(View.VISBLE) 


    viewBounds.getDrawingRect(viewBounds); 
    if (!Rect.intersects(scrollBounds, viewBounds) { 
     // do somthing 
    } 
} 

Layouts khu vực như sau:

  • ScrollView
    • LinearLayout
      • TableLayout
        • Button
        • HiddenView

Tất nhiên, nó rất có thể tôi sẽ về vấn đề này một cách sai lầm hoàn toàn - về cơ bản tôi chỉ muốn chắc chắn rằng các vị trí scrollview chính nó để xem đã trở thành có thể nhìn thấy có thể được nhìn thấy trong toàn bộ.

Nếu cần bất kỳ thông tin nào khác, hãy cho tôi biết!

Trả lời

15

Ok nhờ OceanLife đã chỉ cho tôi đúng hướng! Có thực sự là một yêu cầu gọi lại và ViewTreeObserver.OnGlobalLayoutListener() đã làm các trick. Tôi đã kết thúc việc thực hiện người nghe với lớp phân đoạn của tôi và nhặt nó lên nơi tôi cần nó. Cảm ơn bạn đã cảnh báo quá liên quan đến nhiều cuộc gọi, tôi đã giải quyết vấn đề này bằng cách sử dụng phương thức removeOnGlobalLayoutListener() - hoạt động hấp dẫn.

Code:

... 

// vto initialised in my onCreateView() method 

vto = getView().getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(this); 

... 

@Override 
    public void onGlobalLayout() { 

     final int i[] = new int[2]; 
     final Rect scrollBounds = new Rect(); 

     sView.getHitRect(scrollBounds); 
     tempView.getLocationOnScreen(i); 

     if (i[1] >= scrollBounds.bottom) { 
      sView.post(new Runnable() { 
       @Override 
       public void run() { 
        sView.smoothScrollTo(0, sView.getScrollY() + (i[1] - scrollBounds.bottom)); 
       } 
      }); 
     } 

     vto.removeOnGlobalLayoutListener(this); 
    } 

Chỉ cần có để làm một số dọn dẹp bây giờ ...

+1

Tuyệt. Vui lòng đánh dấu vào mũi tên/+1 nếu nó đã giúp. Chúc mừng. – OceanLife

+0

Yeah đã cố gắng để làm điều đó nhưng điểm danh tiếng của tôi sẽ không cho phép tôi: ( –

10

Vì vậy, nếu tôi đọc đúng vấn đề bạn đang gặp phải là bạn muốn tìm hiểu kích thước của một số chế độ xem trong bố cục để tìm hiểu xem bạn có giao lộ với phụ huynh ScrollView hay không.

Những gì tôi nghĩ bạn đang thấy (như bạn ám chỉ) là hướng dẫn để vẽ chế độ xem, và sau đó trong một số loại điều kiện, trình kết xuất giải quyết các phép đo cho bố cục nơi các đối tượng xem có kích thước thực. Một cách để tìm hiểu loại thứ nguyên mà chế độ xem có trên màn hình là sử dụng trình nghe nhạc cây bố cục. Chúng tôi sử dụng người quan sát này để giải quyết thứ nguyên của màn hình khi tận dụng API Google Charts, yêu cầu chiều rộng pixel và chiều cao được xác định ... tất nhiên trên Android có lẽ là vấn đề lớn nhất đối với nhà phát triển.Vì vậy, quan sát (chơi chữ dự định);

final ViewTreeObserver vto = chart.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    /** 
    * @see android.view.ViewTreeObserver.OnGlobalLayoutListener#onGlobalLayout() 
    */ 
    @SuppressWarnings("deprecation") 
    @Override 
    public void onGlobalLayout() { 
    if (view.getVisibility() == View.GONE) { 
     view.setVisibility(View.VISBLE) 
     viewBounds.getDrawingRect(viewBounds); 
     if (!Rect.intersects(scrollBounds, viewBounds) { 
     // do something 
     } 
    } 
    } 
}); 

Lời cảnh báo onGlobalLayout sẽ được gọi nhiều lần khi trình kết xuất đóng vào giải pháp cuối cùng. Cuộc gọi cuối cùng là cuộc gọi chúng tôi thực hiện.

Điều này sẽ cung cấp cho bạn cơ chế để thực hiện các tác vụ trên chế độ xem được vẽ như nhận chiều rộng và chiều cao của thành phần chế độ xem. Hy vọng điều đó giúp được bạn.

Ngoài ra: Các chaps thông minh tại Quảng trường đã thiết kế một thư viện hamster FEST sẽ cho phép bạn viết một bài kiểm tra cho điều này cùng với Robotium. Check it out.

+0

Chỉ cần nhận thấy rằng phương pháp là '' '' deprecated''''. Hmm. Hy vọng rằng đó là hướng dẫn thay thế rõ ràng. – OceanLife

+0

Yep của bạn chính xác, lý do tôi muốn tìm các kích thước là để kiểm tra xem xem được hiển thị trên màn hình liên quan đến vị trí của ScrollView - nếu nó không phải là tôi muốn di chuyển scrollview cùng. Tôi sẽ kiểm tra ViewTreeObserver ngay khi tôi ra khỏi công việc! Cảm ơn: P –

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