2015-09-25 22 views
6

Görünümü geçersiz kılmadan görünüm görünürlüğü değişimini (GONE'den VISIBLE'ye söyleyin) işlemenin bir yolu var mı?Görünümü geçersiz kılmadan görünümün görünürlük değişimini gerçekleştirin

View.setOnVisibilityChangeListener(); gibi bir şey? Bunun yerine dekorasyon kullanabilirsiniz sınıflara

+0

Elbette emin değilim, ama her zaman tüm görüşlerin görünürlüğünü sürekli olarak izlemek için tüm sistem üzerine çok fazla çalışma koyacağından böyle bir şey olmadığını söyleyebilirim Olası bir dinleyiciyi bilgilendirmek için. – Ridcully

cevap

25

Görünüm görünürlüğünde herhangi bir değişiklik olup olmadığını belirlemek için GlobalLayoutListener kullanabilirsiniz.

+1

Bu çalışır, ancak sadece GONE'den VISIBLE'ye yapılan değişiklikler için düzen değişiklikleri için çalışır ve bunun tersi de INVISIBLE bir düzen değişikliği tetiklemez. Ben haklı mıyım – ToBe

+0

@Bu satırda myView.setTag (myView.getVisibility()); sonra ne yapmak istiyorsan onu ayarlayabilirsin – Trinity

3

:

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

} 

Sonra

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

Bu, yalnızca görünüm için bir yardımcı sınıfı oluşturmak gibidir. Görüşü geçersiz kılmak bence daha iyi olurdu. Ama evet, bu özel "setVisibility()" nin her zaman –

+0

@Nicolas Tyler Submitter'in özel olarak "görünümü geçersiz kılmadan" kullanıldığını varsayarak çalışacağından, "Görüşü geçersiz kılmak" ifadesinin yanlış olduğunu varsayar. Ayrıca, görünümleri geçersiz kılmak, büyük xml değişikliklerine neden olur. Genel olarak yorumunuz –

+0

anlamından yoksun, yanlış değil, OP'nin istediği gibi değil. OP, görünürlük değişiklikleri için bir dinleyici arıyordu. Ve tercihen görüşü geçersiz kılmaya gerek yoktur. –

2

ViewTreeObserver.OnGlobalLayoutListener bir göz atın. Belgede yazıldığı gibi, genel düzen durumu veya görünüm ağacındaki görünümlerin görünürlüğü değiştiğinde geri arama yöntemi onGlobalLayout() çağrılır. Böylece, görünürlük değiştiğinde bunu algılamak için kullanmayı deneyebilirsiniz.

İlgili konular