2015-09-25 6 views
6

क्या व्यू दृश्यता परिवर्तन (कहें, GONE से VISIBLE तक) को देखने के बिना दृश्य को ओवरराइड किए बिना कोई तरीका है?दृश्य को ओवरराइड किए बिना दृश्य दृश्यता परिवर्तन को संभालें

कुछ View.setOnVisibilityChangeListener(); जैसे कुछ?

+0

मुझे यकीन नहीं है, लेकिन मैं कहूंगा कि ऐसी कोई बात नहीं है, क्योंकि यह पूरे सिस्टम पर बहुत सारे काम को हर समय सभी विचारों की दृश्यता को स्थायी रूप से ट्रैक करने के लिए रखेगा , एक संभावित श्रोता को सूचित करने के लिए। – Ridcully

उत्तर

25

विचारों की दृश्यता में कोई बदलाव होने के लिए आप GlobalLayoutListener का उपयोग कर सकते हैं।

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

यह काम करता है लेकिन यह गोयन से विस्बिले में परिवर्तन के लिए क्रमशः लेआउट परिवर्तनों के लिए काम करता है और इसके विपरीत, अविश्वसनीय लेआउट परिवर्तन को ट्रिगर नहीं करता है। क्या मैं सही हू? – ToBe

+0

@ToBe इस लाइन में myView.setTag (myView.getVisibility()); आप जो कुछ भी बाद में संभालना चाहते हैं उसे सेट कर सकते हैं – 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); 
    } 
    } 

} 

फिर

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

यह सिर्फ दृश्य के लिए एक सहायक वर्ग बनाने जैसा है। विचार को ओवरराइड करना मेरी राय में इससे बेहतर होगा। लेकिन हां यह काम करेगा, यह मानते हुए कि विशिष्ट 'सेट दृश्यता() 'का उपयोग हर बार –

+0

@ निकोलस टायलर सबमिटर ने विशेष रूप से" दृश्य को ओवरराइड किए बिना "कहा था, इसलिए आपका कथन" दृश्य ओवरराइड करना बेहतर होगा "झूठा है। इसके अलावा, विचारों को ओवरराइड करने से बड़े पैमाने पर एक्सएमएल परिवर्तन होंगे। आम तौर पर आपकी टिप्पणी –

+0

अर्थ से रहित नहीं है, यह गलत नहीं है, यह सिर्फ ओपी के लिए नहीं पूछा गया है। ओपी दृश्यता में बदलाव के लिए श्रोता की तलाश में था। और अधिमानतः दृश्य को ओवरराइड नहीं करना है। –

2

ViewTreeObserver.OnGlobalLayoutListener पर एक नजर डालें। जैसा कि प्रलेखन में लिखा गया है, इसकी कॉलबैक विधि onGlobalLayout() तब लागू की जाती है जब वैश्विक लेआउट स्थिति या दृश्य वृक्ष के भीतर विचारों की दृश्यता में परिवर्तन होता है। तो आप दृश्यता परिवर्तनों को देखने के दौरान इसका पता लगाने के लिए इसका उपयोग करने का प्रयास कर सकते हैं।

संबंधित मुद्दे