FragmentManager按下后退按钮退出应用程序

时间:2016-02-18 19:34:34

标签: android android-fragments fragmentmanager

有关片段的设置,请参阅this问题:

|  A  |  B  |
         ↓
   |  C  |  D  |
      ↓
   |  E  |

我正在努力弄清楚为什么我的应用程序在按下添加了addToBackStack()的片段上的后退按钮时退出。

根据答案,

案例1:如果我使用getSupportFragmentManager()或getFragmentManager():在我滑动到另一个标签并返回后,我的片段就会消失。

案例2:如果我使用getChildFragmentManager():我在使用E时动态地将片段C添加到addToBackStack()但是当我按下该应用时退出。期望它应该返回C而不是退出。

添加标签CD的代码为:

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);
}

我使用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();
}

我正在使用来自Google github here的SlidingTabLayout。

我有以下问题:

  1. 案例1 的原因是什么?应该使用哪个FM,根据我的理解:getFM()应该用于顶级,getChildFM()应该用于向片段添加片段?
  2. 为什么应用程序退出案例2 ?我还需要做其他事吗?
  3. 如何解决这个问题?已经卡住了一段时间,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

覆盖onBackPressed并为不同的视图寻呼机位置(0,1,2,3 ...)创建一个switch语句,并告诉它在每种情况下要做什么。将其添加到要附加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); } }