PDA

View Full Version : راهنمایی در نویگیشن دراور



slr560
دوشنبه 19 آبان 1393, 01:31 صبح
سلام دوستان
من توی برنامم یک نویگیشن دارم که به محض اینکه روی هر کدوم از آیتم ها کلیک شد متناسب با اون یک فرگمنت داخل container میزارم و نمایش میدم. کامل و درست هم کار میکنه
فقط یه مشکل امروز توش پیدا کردم . به طور تصادفی توی کلاس هر کدوم از فرگمنت ها اومدم متدهای OnResume , OnStop , OnPause رو Override کردم و لاگ گزاشتم که ثبت بشه و دیدم که با کمال تعجب وقتی یک شی از فرگمنت ها میسازم به شکل لاگ زیر نمایش میده

11-10 02:06:20.731 28528-28528/com.daneshjuo.daneshjo D/SupportFragment﹕ OnResume
11-10 02:06:20.741 28528-28528/com.daneshjuo.daneshjo D/SupportFragment﹕ OnPause
11-10 02:06:20.741 28528-28528/com.daneshjuo.daneshjo D/SupportFragment﹕ OnStop
11-10 02:06:20.801 28528-28528/com.daneshjuo.daneshjo D/SupportFragment﹕ OnResume


یعنی اول میاد OnResume رو صدا میزنه و سریع بعد از اون OnPause و بعدش OnStop و در آخر میاد OnResume رو صدا میزنه. این چرا اینجوری میشه؟؟؟ :لبخند:

select نویگیشن به شکل زیر هست:


@Override
public void onNavigationDrawerItemSelected(int position) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
switch (position) {
case 0:
fragmentTransaction.replace(R.id.container, new InfoFragment());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
case 1:
fragmentTransaction.replace(R.id.container, new ParentOtoFragment());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
case 2:
fragmentTransaction.replace(R.id.container, new ParentProFragment());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
case 3:
fragmentTransaction.replace(R.id.container, new SupportFragment());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
case 4:
fragmentTransaction.replace(R.id.container, new AboutFragment());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
}
}


فرگمنت هایی هم که صدا میزنم به این صورت نوشتم:

public class InfoFragment extends Fragment {




public InfoFragment() {
// Required empty public constructor
}




@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_info, container, false);
}


کسی میدونه چرا اینجوری میشه؟؟؟؟

tux-world
دوشنبه 19 آبان 1393, 08:25 صبح
دلیلیش میتونه کد زیر باشه :


fragmentTransaction.replace(R.id.container, new InfoFragment());
چون برای اینها شما اداپتور دارید خود اداپتور خودش گزینه هایی داره که کار replace رو انجام میده. به نظرم این باشه. چیز دیگه ای به ذهنم نمیاد

slr560
دوشنبه 19 آبان 1393, 08:36 صبح
دلیلیش میتونه کد زیر باشه :


fragmentTransaction.replace(R.id.container, new InfoFragment());
چون برای اینها شما اداپتور دارید خود اداپتور خودش گزینه هایی داره که کار replace رو انجام میده. به نظرم این باشه. چیز دیگه ای به ذهنم نمیاد

متوجه منظورتون نشدم. یعنی چی اداپتور داره خودش؟؟
یکم بیشتر توضیح بده لطفا. به نظرت چجوری بنویسمش؟
ممنون دوست عزیز

tux-world
دوشنبه 19 آبان 1393, 09:33 صبح
شما بر اساس تب نوشتید؟

slr560
دوشنبه 19 آبان 1393, 09:38 صبح
شما بر اساس تب نوشتید؟
نویگیشن دراور هست. تب نیست
روی هر کدام از گزینه های نویگیشن کلیک شد یه فرگمنت میاد میشیه توی ظرف مورد نظرش و با قبلی Replace میشه

slr560
دوشنبه 19 آبان 1393, 17:55 عصر
کسی نمیدونه چرا؟

slr560
سه شنبه 20 آبان 1393, 23:35 عصر
یکی بیاااااد یه راهنمایی به ما بکنه :گریه:

MSHService
چهارشنبه 21 آبان 1393, 10:11 صبح
درود دوست عزیز

من تست کردم.

من مثله شما معماریم همینطوریه ولی دقیقا ماننده LifeCycle که خوده گوگل گفته هست.

11-12 07:15:10.046: E/MSH(9876): HomeFragment->onCreateView
11-12 07:15:10.062: E/MSH(9876): HomeFragment->onStart
11-12 07:15:10.062: E/MSH(9876): HomeFragment->onResume

الان اکتیویتیه Home من داره نشون داده میشه و حالا میرم روی ناویگیشن دراورم و اکتیویتیه بعدی رو میگم لود بشه

11-12 07:15:33.182: E/MSH(9876): HomeFragment->onPause
11-12 07:15:33.182: E/MSH(9876): HomeFragment->onStop
11-12 07:15:33.182: E/MSH(9876): HomeFragment->onDestroyView

پس الان فرگمت HOme من چرخه زندگیش محیا شد برای لود فرگمنت بعدی

11-12 07:15:33.186: E/MSH(9876): FragmentDatabasetest->onCreateView
11-12 07:15:33.230: E/MSH(9876): FragmentDatabasetest->onStart
11-12 07:15:33.230: E/MSH(9876): FragmentDatabasetest->onResume

حالا فرگمنت بعدی لود میشه.

مشکل کجاست حالا؟

slr560
چهارشنبه 21 آبان 1393, 18:25 عصر
من آیتم های نویگیشنم به صورت فرگمنت پیاده سازی شده. برای همین مثلا وقتی روی گزینه ها کلیک میکنم فرگمنت جدید روی فرگمنت فبلی replace میشه
حالا مشکل اینجاش وقتی فرگمنت جدیده اجرا میشه مراحل زیر طی میشه
یعنی اول OnResume و پشت سرش سریع OnPause و OnStop میشه . بدون اینکه من دستوری اضافه تر نوشته باشم . و بعدش سریع OnResume که بعدش واسه من نمایش داده میشه. برای من اصلا این مراحل حس نمیشه و به چشم نمیاد ولی فکر میکنم از لحاظ اصولی اشتباس.
در واقع فقط باید ۱ بار OnResume بشه و من ببینمش . همین


11-12 15:20:50.130 1452-1452/com.daneshjuo.daneshjo D/SupportFragment﹕ OnResume
11-12 15:20:50.130 1452-1452/com.daneshjuo.daneshjo D/SupportFragment﹕ OnPause
11-12 15:20:50.130 1452-1452/com.daneshjuo.daneshjo D/SupportFragment﹕ OnStop
11-12 15:20:50.130 1452-1452/com.daneshjuo.daneshjo D/SupportFragment﹕ OnResume

MSHService
چهارشنبه 21 آبان 1393, 20:36 عصر
گفتم که عزیزم برنامه منم دقیقا ماننده شماست ، ولی درست کار میکنه! میخوای سورست رو بزار بررسیش کنیم :)

نمیشه شما توی هر دوتا فرگمنتت بگیری Log بزاری ببینیم چطوری اجرا میشن :)