Пожалуйста, обратитесь к this вопрос для установки фрагментов:FragmentManager нажатием кнопки назад выходит приложение
| A | B |
↓
| C | D |
↓
| E |
Я изо всех сил, чтобы выяснить, почему мое приложение покидает при нажатии на кнопку назад на фрагменте с добавлением addToBackStack().
Согласно ответу,
Случай 1: Если я использую getSupportFragmentManager() или getFragmentManager(): мои фрагменты исчезают после того, как я красть на другую вкладку и вернуться обратно.
Случай 2: если я использую getChildFragmentManager(): Я динамически добавить фрагмент E
к C
при использовании addToBackStack()
но когда я нажимаю назад, выходы приложения. Ожидается, что он должен вернуться к C
вместо выхода.
код для добавления вкладки C
и D
является:
public class MyProfileTabFragmentPagerAdapter extends FragmentPagerAdapter {
private String tabTitles[];
private Context context;
private String userID;
private static final String TAG = makeLogTag(MyProfileTabFragmentPagerAdapter.class);
public MyProfileTabFragmentPagerAdapter(FragmentManager fm, Context context) {
super(fm);
tabTitles = context.getResources().getStringArray(R.array.profileTabs);
this.context = context;
SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(context);
userID = prefs.getString("token", "");
}
@Override
public int getCount() {
return tabTitles.length;
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
{
return UserProfileFragment.getInstance(userID);
}
case 1:
{
return new MySnapsFragment();
}
default:
{
LOGI(TAG, "Invalid tab" + position);
return null;
}
}
}
@Override
public CharSequence getPageTitle(int position) {
// Generate title based on item position
return tabTitles[position];
}
}
Это, как я насторить вкладки в B
, которые я называю в своей onCreateView()
:
private void setupTabs() {
// Get the ViewPager and set it's PagerAdapter so that it can display items
vpProfileTab.setAdapter(new MyProfileTabFragmentPagerAdapter(getChildFragmentManager(), ctx));
// Give the TabLayout the ViewPager
slidingProfileTabs.setDistributeEvenly(true);
slidingProfileTabs.setBackgroundColor(colorAccent2);
slidingProfileTabs.setSelectedIndicatorColors(colorTabIndicator);
slidingProfileTabs.setViewPager(vpProfileTab);
}
I Установка C
от B
использования в onCreateView()
:
private void setupUserProfileFeed() {
if(feedFragment==null){
feedFragment = new FeedFragment();
this.getFragmentManager().beginTransaction().replace(R.id.feed_fragment, feedFragment).addToBackStack()
.commit();
}
}
установки я E
из C
когда я нажимаю кнопку:
@Override
public void onProfileClick(View v) {
UserProfileFragment userProfileFragment = UserProfileFragment.getInstance(userID);
this.getFragmentManager().beginTransaction().replace(R.id.feedContent, userProfileFragment)
.addToBackStack(null).commit();
}
Я использую SlidingTabLayout от Google GitHub here.
У меня есть следующие вопросы:
- Что является причиной Case 1. Какой FM следует использовать в соответствии с моим пониманием: getFM() следует использовать для верхнего уровня, а getChildFM() следует использовать для добавления фрагментов к фрагменту?
- Почему приложение выходит в Дело 2? Нужно ли мне что-то делать?
- Как решить эту проблему в любом случае? Некоторое время застряли, любая помощь высоко ценится.
Пожалуйста, покажите код, который вы используете, getChildFragmentManager() используется для получения FM, который управляет фрагменты в пределах фрагмента. Вы можете использовать его в B для управления C & D. getFragmentManager используется для управления фрагментами для всего действия, если у вас есть фрагменты, исчезающие в то же время, что это может быть ваше использование. –
Я добавил код настройки вкладки, пожалуйста, дайте мне знать, если что-то лишнее. – lionelmessi
Где ваш вызов addToBackStack? –