آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

سوال در مورد روش صحیح فراخوانی و مخفی کردن فرگمنت

هادی بی غم  7 سال پیش  7 سال پیش
0 0

سلام 

دوستان عزیز من از این طریق بارها و بارها با کلیک روی یک دکمه یک فرگمنت رو فراخوانی میکنم آیا این کار باعت ایجاد چندین فرگمنت مشابه میشه یا فقط همون فرگمنت بازسازی میشه و نمایش داده میشه ؟ 

می خوام فرگمنت با کلیک اول فقط برای یکبار ساخته بشه و برای دفعه های بعد فقط resume بشه روش بهتری برای این کار هست ؟

 Fragment frag2=new FragmentSearch();
FragmentManager fragmentManager= getFragmentManager();
FragmentTransaction fragmentTransaction= fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.target_container,frag2);
fragmentTransaction.commit();
+1 0
با هر کلیک به فرگمنت اضافه میشه، شما میتونید هنگام کلیک کردن چک کنید که اگه قبلا اجرا شده دیگه دوباره اجرا نشه. اینو تست کن ببین نتیجه میگیری if(YourFragment.this.isVisible()) (7 سال پیش)
+1 0
با این کد فرگمنت جدیدی دوباره ساخته میشه. خوب یه بولین بسازید و موقعی که یکبار فرگمنت رو ساختید مقدار بولین رو true کنید و چک کنید اگه بولین true بود دیگه نسازه. (7 سال پیش)
0 0
مرسی از راهنماییتون دوستان (7 سال پیش)
 برای این سوال 1 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
مسعود فرمانی  7 سال پیش
+3 0

 پاسخ صحیح

در کلاسی که دکمه و فرگمنت قرار می گیرند متدهای زیر رو اضافه کنید...یک object به صورت فیلد در کلاستون تعریف کنید و هربار با کلیک روی دکمه از متد replaceFragment استفاده کنید و زمانیکه میخواهید محتواهای دیگری (فرگمنت های دیگر) رو جایگزین فرگمنت درحال نمایش کنید مجددا از این متد استفاده کنید ....چون میخواهید فرگمنت جدیدی  ظاهر نشه و همون قبلی ادامه پیدا کنه ، نباید در رخداد کلیک دکمه ، فرگمنت رو 'new' کنید و همونطور که گفتم باید به صورت فیلد تعریف بشه...

   void replaceFragment(Fragment fragment) {

if (fragment != null) {
FragmentTransaction ft = fm.beginTransaction();
ft.replace(fragment);
ft.addToBackStack(null);
//ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}}

 

ادیت : fm در واقع اشاره کننده به شی از کلاس FragmentManager هست و به این صورت تعریف میشه:

 FragmentManager fm = getFragmentManager();//در اکتیویتی معمولی
یا
FragmentManager fm = getSupportFragmentManager();//در اکتیویتی های compat
یا
FragmentManager fm = getChildFragmentManager();//در فرگمنت
 

 

 
0 0
خیلی از راهنمایی تون سپاسگذارم ، یک سوال دیگه هم دارم آیا اجرای 5 یا 6 فرگمنت غیر مشابه در یک اکتیویتی باعث کندی برنامه میشه ؟ اگر visibility پدر فرگمنت ها Invisible باشه باعث کندی در برنامه و ضعف در گوشی های معمولی میشه ؟ (7 سال پیش)
+4 0
نه لزوما!البته این تعداد که مثال زدید خیلی کمه!ولی به هرحال به حجم و اندازه و میزان پردازش هایی که در هر کدوم از object های فرگمنت و object هایی که درونش هستند و .... بستگی داره و ارتباطی به مشابه بودن یا نبودنشون نداره..در ضمن استفاده از اصول برنامه نویسی همزمانی خیلی در روان کار کردن برنامه موثره و البته اینکه در بعضی موارد (مثل نمایش تصاویر پرحجم و ارتباط با سرور بیرونی و ...) دوباره اختراع کردن چرخ کار صحیحی نیست و بهتره از لایبرری هایی که امتحانشون رو پس دادن و بارها توصیه شدن استفاده بشه تا برنامه روان تر و صحیح تر کار کنه.....من خودم در حال توسعه پروژه ای هستم که تقریبا همه ی قابلیت های برنامه در یک صفحه اکتیویتی با استفاده از فرگمنت های مختلف(همزمان) قرار دارند و فک می کنم حدودا 15 عدد فرگمنت میشه!!...و اینکه قرار دادن Visibilityدر حالت Invisible به این معنی نیست که عنصر مورد نظر منابعی مصرف نمیکنه ، بلکه هنوزم در حافظه هست و فقط نمایش داده نمیشه.حتی قرار دادن Visiblity درحالت GONE هم همینطوره.... نکته:فقط زمانی اقدام به ساختن object کن که واقعا بهش نیاز داری.... (7 سال پیش)
0 0
تشکر بابت توضیحات با ارزش تون (7 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .