بهترین روش برای instanc گرفتن از فرگمنت ، به جای مستقیم نیو کردن ، استفاده از متد استاتیک newInstance به شکل زیر هست : درواقع newInstance یک Static Factory Methodهست .که توسط یک متد استاتیک در خود کلاس ، عمل نیو و اینیت شی انجام میشه.
public static Fragment1 newInstance(String param1, String param2) {
Fragment1 fragment = new Fragment1();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
_خب کاری که اینجا انجام میشه اینه که پارامترهای ما در bundle قرار میگیره و ست ارگومنت میشه .
- مزایا :
فرگمنت، باندِ به لایف سایکله اکتیویتی و هر بلایی سر اکتیویتی بیاد سر فرگمنتم میاد چون کانتینرشه؛ کانفیگوریشن چنجا همه برای اکتیویتی مهمن یعنی یه کانفیگوریشن چنجی مثه روتیت رخ بده اول واسه اکتیویتی پیش اومده بعد زیر مجموعه هاش…. اون متد newInstanc بعد از کانفیگوریشن چنج یا ریکریت شدن اکتیویتی مجدد کال نمیشه !!!! و خود اکتیویتی یه اینستنس دیگهای میسازه. یعنی یک نمونه گیری ساده با new ! حالا تو این حالت کانستراکتور پیش فرض فرگمنت کال میشه .خب حالا تکلیف اون پارامترهاایی که ب فرگمنت پاس دادیم چی میشه؟
خب اینجاست اون باندلی که setArgument کردیم ب کمکمون میاد و ازشون میتونیم با متد getargument از اون پارامترهای ارسالی استفاده کنیم. و بااین کار به ازای هرنمونه از فرگمنت از همون مقادبر باندل که ست کردیم استفاده میکنه .
- سوال :
چرا خب بدین شکل عمل نکردیم =>
MyFragment fragment = new MyFragment();
Bundle args = new Bundle();
// set your arguments here
fragment.setArguments(args);
خب اگر بخواهیم اینطوری نیو کنیم هربار باید اینو تکرار کنیم . و شاید اونی ک میخواد نیو کنه ندونه باید ست ارگومنت کنه خب یک بار تو متد newInstanc از فرگمنت نمونه گیری و setArgument مینویسیم و خب اینکارا توسط متد هندل میشه .
اینم یک نمونه لاگ از لایف سایکل اکتیوتی و فرگمنت هنگام روتیت صفحه.
دقت کنید متد newInstanc یکبار کال شده و بعد روتیت دوباره کال نشده .