suraty
یک شنبه 13 فروردین 1396, 13:01 عصر
سلام، در برنامه ای علاوه بر وجود navigation drawer و toolbar، در صفحه اصلی تب هایی در پایین صفحه وجود دارد. (مثلا خانه، سوالات متداول، پروفایل، راهنما و...) نیز وجود دارد.
با زدن هر یک از این تب ها به صفحه ای میرویم که امکان ایجاد صفحات تودرتویی در هر کدام وجود دارد.
مثلا در صفحه اصلی (تب خانه) کلیک روی هر عنوان میتواند ما را به زیرعنوانهایی در همان تب راهنمایی کند. مثلا حالا در تب خانه، به فرض چندین زیرعنوان را طی کرده و در همین لحظه روی تب پروفایل میرویم و پروفایل را مشاهده میکنیم در همین تب پروفایل روی ویرایش رفته و به صفحه داخلی تری هدایت میشویم. اکنون با دوبار زدن دکمه back پیغام خروج از برنامه ظاهر میشود و اگر به تب خانه برگردیم با تعداد صفحات تودرتویی که فقط در همین تب بوده اند به خروج از برنامه میرسیم. به عبارتی هر کدام از تب ها مستقل از هم عمل میکنند. گویا که stack هر کدام جدا است.
اگر اینها با fragment ساخته شده اند، چطور با کلیک روی back گوشی برگشت از تنها صفحات تودرتوی یک تب شکل میگیرد؟
من یک actvity اصلی دارم که منوی کشویی و تولبار در آن است. تب ها یا صفحات تو در تو در قالب fragment در این صفحه گشوده میشوند. برای برگشت در actvity اصلی که fragment ها در آن لود میشوند این کد را دارم:
public static boolean recursivePopBackStack(FragmentManager fragmentManager) {
if (fragmentManager.getFragments() != null) {
for (Fragment fragment : fragmentManager.getFragments()) {
if (fragment != null && fragment.isVisible()) {
boolean popped = recursivePopBackStack(fragment.getChildFragmentMan ager());
if (popped) {
return true;
}
}
}
}
if (fragmentManager.getBackStackEntryCount() > 0) {
fragmentManager.popBackStack();
fragmentManager.executePendingTransactions();
return true;
}
return false;
}
public void close_handler() // a function that show alert dialog for closing
// program
{
if (!recursivePopBackStack(getSupportFragmentManager( ))) {
super.onBackPressed();
}
}
اما با این کار فرگمنت ها در هر تبی که باز شده اند به ترتیب از آخر به اول بسته میشوند (فرقی نمیکند از کدام تب باز شده اند، در حالی که انتظار دارم تنها صفحات تو در توی همین صفحه بسته شود). حتی به این فکر افتادم که stack با کلیک یک روی یک تب خالی شود اما این هم راه حل صحیحی نیست زیرا امکان دارد کاربر به تب قبلی باز گردد و در آن بخواهد back را بزند.
با زدن هر یک از این تب ها به صفحه ای میرویم که امکان ایجاد صفحات تودرتویی در هر کدام وجود دارد.
مثلا در صفحه اصلی (تب خانه) کلیک روی هر عنوان میتواند ما را به زیرعنوانهایی در همان تب راهنمایی کند. مثلا حالا در تب خانه، به فرض چندین زیرعنوان را طی کرده و در همین لحظه روی تب پروفایل میرویم و پروفایل را مشاهده میکنیم در همین تب پروفایل روی ویرایش رفته و به صفحه داخلی تری هدایت میشویم. اکنون با دوبار زدن دکمه back پیغام خروج از برنامه ظاهر میشود و اگر به تب خانه برگردیم با تعداد صفحات تودرتویی که فقط در همین تب بوده اند به خروج از برنامه میرسیم. به عبارتی هر کدام از تب ها مستقل از هم عمل میکنند. گویا که stack هر کدام جدا است.
اگر اینها با fragment ساخته شده اند، چطور با کلیک روی back گوشی برگشت از تنها صفحات تودرتوی یک تب شکل میگیرد؟
من یک actvity اصلی دارم که منوی کشویی و تولبار در آن است. تب ها یا صفحات تو در تو در قالب fragment در این صفحه گشوده میشوند. برای برگشت در actvity اصلی که fragment ها در آن لود میشوند این کد را دارم:
public static boolean recursivePopBackStack(FragmentManager fragmentManager) {
if (fragmentManager.getFragments() != null) {
for (Fragment fragment : fragmentManager.getFragments()) {
if (fragment != null && fragment.isVisible()) {
boolean popped = recursivePopBackStack(fragment.getChildFragmentMan ager());
if (popped) {
return true;
}
}
}
}
if (fragmentManager.getBackStackEntryCount() > 0) {
fragmentManager.popBackStack();
fragmentManager.executePendingTransactions();
return true;
}
return false;
}
public void close_handler() // a function that show alert dialog for closing
// program
{
if (!recursivePopBackStack(getSupportFragmentManager( ))) {
super.onBackPressed();
}
}
اما با این کار فرگمنت ها در هر تبی که باز شده اند به ترتیب از آخر به اول بسته میشوند (فرقی نمیکند از کدام تب باز شده اند، در حالی که انتظار دارم تنها صفحات تو در توی همین صفحه بسته شود). حتی به این فکر افتادم که stack با کلیک یک روی یک تب خالی شود اما این هم راه حل صحیحی نیست زیرا امکان دارد کاربر به تب قبلی باز گردد و در آن بخواهد back را بزند.