setUserVisibleHint()
कभी-कभी पहले बुलाया जाता है onCreateView()
और कभी-कभी परेशानी का कारण बनता है।
इसे दूर करने के लिए आपको isResumed()
अंदर की setUserVisibleHint()
विधि की भी जांच करनी होगी । लेकिन इस मामले में मुझे एहसास हुआ कि केवलsetUserVisibleHint()
कहा जाता है अगर फ्रेग्मेंट फिर से शुरू और दिखाई दे रहा है, तो तब है जब क्रिएट नहीं किया गया हो।
इसलिए यदि आप कुछ अद्यतन करना चाहते हैं visible
, जब Fragment है , तो अपना अद्यतन कार्य दोनों में डालें ( onCreate()
और setUserVisibleHint()
:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
अद्यतन: फिर भी मुझे एहसास हुआ कि myUIUpdate()
दो बार कभी-कभी कॉल किया जाता है, इसका कारण यह है, यदि आपके पास 3 टैब हैं और यह कोड 2 टैब पर है, जब आप पहली बार 1 टैब खोलते हैं, तो 2 टैब भी बनाया जाता है, यह भी दिखाई नहीं देता है और myUIUpdate()
कहा जाता है। तब जब आप 2 टैब पर स्वाइप करते हैं, तब myUIUpdate()
से if (visible && isResumed())
कॉल किया जाता है और इसके परिणामस्वरूप,myUIUpdate()
एक सेकंड में दो बार फोन किया जा सकता है।
अन्य समस्या है !visible
मेंsetUserVisibleHint
कहा जाता हो जाता है दोनों 1) जब आप जब तुम टुकड़ा स्क्रीन पहली बार के लिए स्विच टुकड़ा स्क्रीन और 2) इससे पहले कि यह बनाया जाता है, से बाहर जाना।
समाधान:
private boolean fragmentResume=false;
private boolean fragmentVisible=false;
private boolean fragmentOnCreated=false;
...
@Override
public View onCreateView(...){
...
//Initialize variables
if (!fragmentResume && fragmentVisible){ //only when first time fragment is created
myUIUpdate();
}
...
}
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){ // only at fragment screen is resumed
fragmentResume=true;
fragmentVisible=false;
fragmentOnCreated=true;
myUIUpdate();
}else if (visible){ // only at fragment onCreated
fragmentResume=false;
fragmentVisible=true;
fragmentOnCreated=true;
}
else if(!visible && fragmentOnCreated){// only when you go out of fragment screen
fragmentVisible=false;
fragmentResume=false;
}
}
स्पष्टीकरण:
fragmentResume
, fragmentVisible
: सुनिश्चित करें कि बनाता myUIUpdate()
में onCreateView()
ही जब टुकड़ा बनाई गई है और दिखाई, फिर से शुरू पर नहीं कहा जाता है। जब आप 1 टैब पर होते हैं, तब भी यह समस्या हल करती है, यदि दिखाई न दे तो भी 2 टैब बनाया जाता है। यह हल करता है और जांचता है कि टुकड़ा स्क्रीन कब दिखाई दे रही है onCreate
।
fragmentOnCreated
: यकीन है कि टुकड़ा दिखाई नहीं देता है, और नहीं कहा जाता है जब आप पहली बार टुकड़ा बनाते हैं। तो अब यह तब होता है जब खंड केवल तब कहा जाता है जब आप खंड से बाहर स्वाइप करते हैं।
अद्यतन
आप में यह सब कोड डाल सकते हैं BaseFragment
कोड इस तरह और ओवरराइड विधि।