setUserVisibleHint()
আগে কখনও কখনও বলা হয় onCreateView()
যা সমস্যার কারণ হয়।
এ থেকে উত্তরণের জন্য আপনাকে isResumed()
পাশাপাশি অভ্যন্তর setUserVisibleHint()
পদ্ধতিও পরীক্ষা করতে হবে । তবে এই ক্ষেত্রে আমি বুঝতে পেরেছি যে কেবল কল হয়setUserVisibleHint()
called যদি অসম্পূর্ণ অংশ পুনরায় শুরু এবং দৃশ্যমান হয়, যখন তৈরি করা হয়েছে।
সুতরাং আপনি যদি খণ্ডের সময় কিছু আপডেট করতে চান তবে visible
আপনার আপডেটের কাজটি এতে onCreate()
এবং উভয়ই রেখে দিন setUserVisibleHint()
:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
আপডেট: তবুও আমি বুঝতে পারি যে myUIUpdate()
কখনও কখনও দু'বার কল করা হয়, কারণটি হ'ল যদি আপনার 3 টি ট্যাব থাকে এবং এই কোডটি 2 য় ট্যাবে থাকে, যখন আপনি প্রথম 1 ম ট্যাবটি খোলেন, দ্বিতীয় ট্যাবটি তৈরি হয় এমনকি এটি দৃশ্যমান নয় এবং 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()
শুধুমাত্র যখন টুকরা তৈরি করা হয় এবং দৃশ্যমান, পুনরায় শুরু না বলা হয়। এটি আপনি প্রথম ট্যাবে থাকা অবস্থায় সমস্যা সমাধান করে, ২ য় ট্যাব দৃশ্যমান না হলেও তৈরি করা হয়। এটি সমাধান করে এবং খণ্ডের স্ক্রিনটি কখন প্রদর্শিত হবে তা পরীক্ষা করে onCreate
।
fragmentOnCreated
: নিশ্চিত করুন যে খণ্ডটি দৃশ্যমান নয়, এবং যখন আপনি প্রথমবার খণ্ড তৈরি করবেন তখন কল হয় না। সুতরাং এখন আপনি যদি খণ্ডটি সোয়াইপ করেন তখন ক্লজটি কেবল তখনই কল হয়।
আপডেট করুন
আপনি এই সব কোড লাগাতে পারেন BaseFragment
কোড ভালো এবং ওভাররাইড পদ্ধতি।