بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ
قابلیت برگشت پذیری از فرگمنت اجرا شده به صفحه main activity با استفاده از دکمه های برگشت سخت افزاری اندروید
مدیریت گفتگو
آخرین تغییر: 8 سال پیش
سلام.
من یک برنامه دارم که از طریق منو به فرگمنت هایی که تعریف کردم داخل میشم.
اما وقتی میخوام دکمه برگشت دستگاهمو بزنم از برنامه خارج میشه.
من میخوام دکمه back دستگاه خاصیت برگشت بگیره.
پاسخها 23
سلام وقتی دکمه بک رو که میزنم به تب قبلی برمیگرده ولی مجدد میخام به تب قبلیه قبلی برگردم حتما باید ۲ بار بک رو بزنم؟ برای مثال من 5 تا تب دارم (A,B,C,D,E,F) از تب A میرم به تب B و از تب B به تب C میرم و وقتی دکمه بک رو میزنم به تب B برمیگرده ولی وقتی دوباره از تب B به تب A میخام برگردم باید حتما 2 بار دکمه بک رو بزنم.میدونین مشکلم کجاست؟ در ضمن از Bottombar Navigition استفاده میکنم.ممنون میشم راهنمایی کنین
نظرات
سلام. نمونه کدهاتون رو قرار بدید. برای حل این مشکلات باید توی متد onBackPressed دیباگ کنید ببینید چه اتفاقی میوفته. باز با سورس هاتون شاید بشه کمک کرد.
آقای حاج حسینی ممنون و اینم کدم
public class ActivityMain extends ActivityEnhanced {
FragmentHome fragment1;
FragmentMap fragment2;
FragmentGram fragment3;
FragmentCard fragment4;
FragmentUser fragment5;
ViewGroup frameLayout;
public static FragmentManager fragmentManager;
public static BottomBar bottomBar;
@Override
protected void onResume() {
bottomBar.selectTabAtPosition(G.bottomBarPosition);
super.onResume();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bottom_nav);
frameLayout = (ViewGroup) findViewById(R.id.frameLayout);
fragment1 = new FragmentHome();
fragment2 = new FragmentMap();
fragment3 = new FragmentGram();
fragment4 = new FragmentCard();
fragment5 = new FragmentUser();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.frameLayout, fragment1);
transaction.commit();
// BottomBarTab cardCount = bottomBar.getTabWithId(R.id.tab_card);
// cardCount.setBadgeCount(5);
// Log.d(G.TAG,"cardin");
bottomBar.setOnTabSelectListener(new OnTabSelectListener() {
@Override
public void onTabSelected(@IdRes int tabId) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
switch (tabId) {
case R.id.tab_home:
transaction.replace(R.id.frameLayout, fragment1);
transaction.addToBackStack("tab_home");
transaction.commit();
break;
case R.id.tab_map:
transaction.replace(R.id.frameLayout, fragment2);
transaction.addToBackStack("tab_map");
transaction.commit();
break;
case R.id.tab_gram:
transaction.replace(R.id.frameLayout, fragment3);
transaction.addToBackStack("tab_gram");
transaction.commit();
break;
case R.id.tab_card:
transaction.replace(R.id.frameLayout, fragment4);
transaction.addToBackStack("tab_card");
transaction.commit();
break;
case R.id.tab_user:
transaction.replace(R.id.frameLayout, fragment5);
transaction.addToBackStack("tab_user");
transaction.commit();
break;
}
}
});
}
}
نظرات
چند روزی نبودم. خوب برادر شما یک بار داری فرگمنت Home رو ست میکنی، بعد توی onTabSelected هم یک بار ست میشه دوباره. یه حرکتی بکن. یه لاگ بنداز قبل از هر کامیتی که توی این کدا داری. اونوقت میبینی که 2 بار کال میشه. دیباگ کنی هم که خیلی بهتره.
برای حل این مشکل یه مقدار boolean بالای اکتیویتی تعریف کن که مقدارش true باشه. اسمشم بذار fromLoad. توی متد setOnTabSelectListener اگر fromLoad = true بود addToBackStack نزن و اگر بود بزن. اون بار اول که home رو ست میکنی تاثیری توی روند نداره فقط مموری رو اشغال میکنه، چون دیفالت همیشه setOnTabSelectListener کال میشه و اولین فرگمنت ست میشه. و همونجوری که خودتم میدونی، بار اول نباید addToBackStack براش ست شه.
این یه خط رو هم برداری حله transaction.addToBackStack("tab_home");
D:
چون شما وقتی توی هوم هستی میخوای بسته شه دیگه؟ پس بار اول و دوم نداره. برش دار که هربار هوم بودی بسته شه با یه بک.
اون مشکلم رو حل کردم یه مشکل دیگه دارم اینه که وقتی تب خاصی رو انتخاب میکنم رنگش عوض میشه و هیچ مشکلی نداره ولی وقتی با دکمه بک گوشی به تب قبلی برمیگردم رنگش عوض نمیشه
چون داری replace میکنی، فکر کنم بتونی از onResume توی فرگمنت ها استفاده کنی. یه تست بزن کد تغییر رنگ رو توی onResume بنویس ببین کار میکنه یا نه.
bottombar.setActiveTabColor رو هم زدم ولی رنگش تغییر نکرد
مگه bottombar توی اکتیویتی تعریف نشده؟ ساختارتو چجوری چیدی؟ یه عکس با توضیحات که چه ویویی مال اکتیویتی و فرگمنته اضافه کن بهتر بتونیم کمک کنیم.
ا
ین کد اکتیویتی مینم هست که از کتابخانه com.roughike.bottombar.BottomBar استفاده میکنم
public class ActivityMain extends ActivityEnhanced {
FragmentHome fragment1;
FragmentMap fragment2;
FragmentGram fragment3;
FragmentCard fragment4;
FragmentUser fragment5;
ViewGroup frameLayout;
public static FragmentManager fragmentManager;
public static BottomBar bottomBar;
@Override
protected void onResume() {
bottomBar.selectTabAtPosition(G.bottomBarPosition);
super.onResume();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
frameLayout = (ViewGroup) findViewById(R.id.frameLayout);
fragment1 = new FragmentHome();
fragment2 = new FragmentMap();
fragment3 = new FragmentGram();
fragment4 = new FragmentCard();
fragment5 = new FragmentUser();
bottomBar = (BottomBar) findViewById(R.id.bottomBar);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.frameLayout, fragment1);
transaction.commit();
// BottomBarTab cardCount = bottomBar.getTabWithId(R.id.tab_card);
// cardCount.setBadgeCount(5);
// Log.d(G.TAG,"cardin");
bottomBar.setOnTabSelectListener(new OnTabSelectListener() {
@Override
public void onTabSelected(@IdRes int tabId) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
switch (tabId) {
case R.id.tab_home:
G.bottomBarPosition=0;
transaction.replace(R.id.frameLayout, fragment1);
transaction.addToBackStack("tab_home");
transaction.commit();
break;
case R.id.tab_map:
G.bottomBarPosition=1;
transaction.replace(R.id.frameLayout, fragment2);
transaction.addToBackStack("tab_map");
transaction.commit();
break;
case R.id.tab_gram:
G.bottomBarPosition=2;
transaction.replace(R.id.frameLayout, fragment3);
transaction.addToBackStack("tab_gram");
transaction.commit();
break;
case R.id.tab_card:
G.bottomBarPosition=3;
transaction.replace(R.id.frameLayout, fragment4);
transaction.addToBackStack("tab_card");
transaction.commit();
break;
case R.id.tab_user:
G.bottomBarPosition=4;
transaction.replace(R.id.frameLayout, fragment5);
transaction.addToBackStack("tab_user");
transaction.commit();
break;
}
}
});
}
}
اینم نمونه فرگمن ها است
public class FragmentMap extends Fragment {
View layout;
public FragmentMap() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ActivityMain.bottomBar.selectTabAtPosition(1);
layout=inflater.inflate(R.layout.fragment_map, container, false);
Button button=(Button)layout.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(G.TAG,"cookie:");
}
});
return layout;
}
نظرات
مهدی جان باید بری توی سورس این کتابخونه ای که استفاده میکنی ببینی از چی استفاده کرده. اگر از ویو پیجر استفاده کرده باشه یا چند تا فرگمنتو توی حافظه نگه داره کارت سخت میشه، ولی به احتمال زیاد اینطور نیست. باز به نظر من توی onResume دیباگ کن ببین اصن میاد یا نه. ولی من موندم که چرا باید از کتابخونه استفاده کنی، خیلی راحت میتونستی خودت بسازیش!
نمونه دارین ازش بتونم کمک بگیرم؟
ببین خیلی ساده میتونی اینارو توی اکتیویتی تعریف کنی. زمانی که هرکدوم کلیک میشه، رنگ همه رو عادی کن بعد رنگ اونی که انتخاب شده رو رنگی کن. اگر دکمه بک کلیک شد، ببین اونی که رنگیه کدومه، اگر Main بود که از اپ خارج شو، اگر نبود که برو مین و مین رو رنگی کن. به همین راحتی. نیازی به کتابخانه هم نداری.
باشه ممنون بابت زاهنماییتون
تست میکنم
یه سوال دیگه آقای حاج حسینی: تو کدوم قسمت از فرگمنت باید کدهامو بنویسیم که یکبار اجرا بشه و هر بار که کاربر تو تب کلیک میکنه دوباره ساخته نشه برای مثال تو تب اول ده آیتم اسکرول کرده و به تب سوم میره و دوباره تب اول رو انتخاب میکنه میخام اسکرول به اول نیاد .ممنون
اگر تب ها 3 تاست. میتونی همرو توی حافظه نگه داری. خوده ویو پیجر متدی داره که بهش میگی چند تا فرگمنتو لود کنه (اسمش یادم نیست سرچ کنید). اگر تعداد زیاده، میشه میزان اسکرول رو به فرگمنت پاس داد یا یه جا ذخیره کرده توی فرگمنت دوباره خوند. از متدای استاتیکم میشه استفاده کرد که پیشنهاد نمیکنم. حتی میشه یک کلاس کنترلر ساخت که دیتا رو هندل کنه و فرگمنت فقط نقش نمایش روی ویو هارو داشته باشه. در کل خیلی راه ها هست ولی من همون اولی رو پیشنهاد میکنم اگر تعداد فرگمنت ها کمه.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
ویرایش
پیام
نظرات