نویگیشن کامپوننت که یکی از زیر مجموعه های لایبرری Jetpack به شمار میره، برای این به وجود اومده که کار با فرگمنت ها رو ساده کنه. عمدتا از نویگیشن کامپوننت در اپ های single activity استفاده میشه.
نویگیشن کامپوننت که یکی از زیر مجموعه های لایبرری Jetpack به شمار میره، برای این به وجود اومده که کار با فرگمنت ها رو ساده کنه. عمدتا از نویگیشن کامپوننت در اپ های single activity استفاده میشه.
توی کدوم یک از این متدها باید لاجیک کد (یعنی initialize و بقیه موارد) رو انجام داد؟
اینجا میگه توی onCreateView فقط ویو inflate شود و در onViewCreated لاجیک کد رو بنویسیم. دلیلشم اینه که میگه ممکنه توی متد onCreateView هنوز ویو آماده نشده باشه و ممکنه اپ کرش کنه.
ولی توی متد onViewCreated که بلافاصله بعد onCreateView اجرا میشه، مطمئنیم که ویو آماده هست. بنظر من منطقیه. مضاف بر اینکه خود سایت وزین اندروید هم این نظر رو دارن که اینجا نوشته.
این کرنومتر یه مقدار عجیبه! این ویو اکستند شده از تکست ویو بوده و یک تایمر ساده رو پیاده سازی میکنه.
علاوه بر این، دیتای خاصی توی خودش نگه نمیداره.
این کرنومتر دارای متدهای start و stop هست و pause نداره. ولی میشه خودمون pause رو پیاده سازی کنیم.
اگر یک نویگیشن به این صورت داشته باشیم:
A > B > C > A
برای پیاده سازی این بهتره به addToBackstack یک استرینگ به عنوان اسم بدهیم و پس از فرگمنت C توسط popBackStack فرگمنت A را پاپ کنیم.
مشکلی که توی اپ بلاگ داشتم این بود که اگر کاربر بیشتر از یک بار روی فرگمنت میزد، همه دفعات در استک ثبت میشد و اگر بک رو میزدیم به همون تعداد پاپ میشد که خب زیاد جالب نیست!
متد popBackStack اوور لودهای زیر را دارد:
popBackStack(int, int)
popBackStack(String, int)
در حالت پیش فرض بک استک فقط برای اکتیویتی وجود داره و فرگمنتها بک استک ندارن. برای استفاده از بک استک فرگمنت باید اون رو توی کد فعال کنیم.
بدین صورت:
Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragContainer);
if (currentFragment instanceof F1) {
//do your stuff here
}
fragContainer همون لیوتی هست که فرگمنت داخل اون لود میشه.
F1 فرگمنت مورد نظر.
اینو برای مدیریت دکمه بک در پروژه بلاگ کشف کردم! برای اینکه اگر توی فرگمنتای دیگه بود به فرگمنت Home بره و اگر توی فرگمنت Home بود از اپ بره بیرون. این قسمت توی onBackpressed نوشته میشه.
اگر برای تگ include آی دی گذاشتیم، آی دی روت هم "حتما" باید همون باشه. برای findViewById کردن به صورت زیر عمل می کنیم:
<include
android:id="@+id/outer"
layout="@layout/test" />
FrameLayout outer = (FrameLayout)findViewById(R.id.outer);
//در خط بالا به جای فریم لیوت میشد از ویو استفاده کرد
ImageView iv = (ImageView)outer.findViewById(R.id.inner);
if (iv == null) {
Log.e(TAG, "Not found!");
}
اگر تگ include آی دی نداشت، نیازی نیست اول include رو initialize کنیم. به صورت قبل findViewById انجام میشود.
اگر به هر دلیلی عکس توسط گلاید لود نشه، با تعریف placeholder میشه عکس پیش فرض را مشخص کرد. بدین صورت:
Glide.with(fragment)
.load(url)
.placeholder(R.drawable.placeholder)
.into(view);
یا
Glide.with(fragment)
.load(url)
.placeholder(new ColorDrawable(Color.BLACK))
.into(view);