2015-09-25 28 views
6

Có cách nào để xử lý thay đổi hiển thị chế độ xem (giả sử từ GONE thành VISIBLE) mà không ghi đè chế độ xem không?Xử lý thay đổi hiển thị chế độ xem mà không ghi đè chế độ xem

Thứ gì đó như View.setOnVisibilityChangeListener();?

+0

Tôi không biết chắc chắn, nhưng tôi muốn nói không có điều gì, vì nó sẽ đặt nhiều công việc lên toàn bộ hệ thống để theo dõi vĩnh viễn khả năng hiển thị của tất cả các lượt xem mọi lúc , để thông báo cho một người nghe có thể. – Ridcully

Trả lời

25

Bạn có thể sử dụng GlobalLayoutListener để xác định xem có bất kỳ thay đổi nào trong chế độ hiển thị lượt xem hay không.

myView.setTag(myView.getVisibility()); 
myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     int newVis = myView.getVisibility(); 
     if((int)myView.getTag() != newVis) 
     { 
      myView.setTag(myView.getVisibility()); 
      //visibility has changed 
     } 
    } 
}); 
+1

Tính năng này hoạt động nhưng nó chỉ hoạt động đối với thay đổi bố cục tương ứng cho các thay đổi từ GONE thành VISIBLE và ngược lại vì INVISIBLE không kích hoạt thay đổi bố cục. Tôi có đúng không? – ToBe

+0

@ToBe trong dòng này myView.setTag (myView.getVisibility()); bạn có thể đặt bất cứ điều gì bạn muốn xử lý sau đó – Trinity

3

Thay vì subclassing bạn có thể sử dụng trang trí:

class WatchedView { 
    static class Listener { 
    void onVisibilityChanged(int visibility); 
    } 

private View v; 
private Listener listener; 
    WatchedView(View v) { 
    this.v = v; 
    } 

void setListener(Listener l) { 
    this.listener = l; 
} 

    public setVisibility(int visibility) { 
    v.setVisibility(visibility); 
    if(listener != null) { 
     listener.onVisibilityChanged(visibility); 
    } 
    } 

} 

Sau đó

WatchedView v = new WatchedView(findViewById(R.id.myview)); 
v.setListener(this); 
+0

Điều này giống như việc tạo một lớp trợ giúp cho khung nhìn. Việc ghi đè lượt xem sẽ tốt hơn điều này theo ý kiến ​​của tôi. Nhưng có điều này sẽ làm việc, giả định rằng 'setVisibility()' cụ thể đang được sử dụng mỗi lần –

+0

@Nicolas Tyler Submitter cụ thể nói "không ghi đè chế độ xem" để tuyên bố của bạn "Ghi đè lượt xem sẽ tốt hơn" là sai. Bên cạnh đó, việc ghi đè lượt xem sẽ dẫn đến thay đổi xml lớn. Nói chung bình luận của bạn không có ý nghĩa –

+0

nó không sai, nó không chỉ là những gì OP yêu cầu. OP đang tìm kiếm một người nghe để thay đổi mức độ hiển thị. Và tốt nhất là không phải ghi đè chế độ xem. –

2

Hãy xem ViewTreeObserver.OnGlobalLayoutListener. Như được viết trong tài liệu, phương thức gọi lại onGlobalLayout() của nó được gọi khi trạng thái bố cục toàn cục hoặc khả năng hiển thị của các khung nhìn trong các thay đổi của cây xem. Vì vậy, bạn có thể thử sử dụng nó để phát hiện khi xem thay đổi hiển thị.

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