2016-02-18 8 views
0

Пожалуйста, обратитесь к 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.

У меня есть следующие вопросы:

  1. Что является причиной Case 1. Какой FM следует использовать в соответствии с моим пониманием: getFM() следует использовать для верхнего уровня, а getChildFM() следует использовать для добавления фрагментов к фрагменту?
  2. Почему приложение выходит в Дело 2? Нужно ли мне что-то делать?
  3. Как решить эту проблему в любом случае? Некоторое время застряли, любая помощь высоко ценится.
+0

Пожалуйста, покажите код, который вы используете, getChildFragmentManager() используется для получения FM, который управляет фрагменты в пределах фрагмента. Вы можете использовать его в B для управления C & D. getFragmentManager используется для управления фрагментами для всего действия, если у вас есть фрагменты, исчезающие в то же время, что это может быть ваше использование. –

+0

Я добавил код настройки вкладки, пожалуйста, дайте мне знать, если что-то лишнее. – lionelmessi

+0

Где ваш вызов addToBackStack? –

ответ

1

переопределить onBackPressed и сделать оператор switch для разных позиций пейджера представления (0,1,2,3 ...) и сообщить ему, что делать в каждом случае. Добавьте это к основной деятельности, в которой вы подключаете адаптер viewPager. Этот примерный код - это простой способ сделать это, если вы хотите, чтобы более сложное поведение использовало оператор switch, как описано выше.

@Override public void onBackPressed() { if (mViewPager.getCurrentItem() == 0) { // If the user is currently looking at the first page, allow android to handle the // Back button. This exits the app because you are on the first fragment. super.onBackPressed(); } else { // Otherwise, select the fragment in the viewPager mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1); } }

+0

В каком фрагменте мне нужно сделать это, или мне нужно сделать это в действиях верхнего уровня? Любое использование выборки было бы полезно. – lionelmessi

+0

Ну, на самом деле случай 2 кажется ошибкой, которую Google не исправит! https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened&groupby=&sort=&id=40323 – lionelmessi

+0

Удивительный, надеюсь, что я мог бы помочь хотя ... –

Смежные вопросы