【问题标题】:FragmentManager pushing back button exits the appFragmentManager 按下返回按钮退出应用程序
【发布时间】:2016-02-19 05:29:18
【问题描述】:

fragment的设置请参考this问题:

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

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

根据回答,

案例 1:如果我使用 getSupportFragmentManager() 或 getFragmentManager():在我滑动到不同的选项卡并返回后,我的片段消失了。

案例 2: 如果我使用 getChildFragmentManager():我在使用 addToBackStack() 时动态地将 Fragment E 添加到 C,但是当我按下返回时,应用程序退出。期望它应该返回到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);
}

我在onCreateView() 中使用B 设置C

    private void setupUserProfileFeed() {
    if(feedFragment==null){
        feedFragment = new FeedFragment();
        this.getFragmentManager().beginTransaction().replace(R.id.feed_fragment, feedFragment).addToBackStack()
                .commit();
    }
}

当我点击一个按钮时,我从C 设置E

@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为什么会退出App?我还需要做什么吗?
  3. 如何解决这个问题?卡了一段时间,非常感谢任何帮助。

【问题讨论】:

  • 请显示您正在使用的代码,getChildFragmentManager() 用于获取管理片段内片段的FM。您可以在 B 中使用它来管理 C 和 D。getFragmentManager 用于管理整个 Activity 的片段,如果您在同一个 Activity 中让片段消失,则可能是您使用它。
  • 我已经添加了标签设置代码,如果需要额外的,请告诉我。
  • 您的 addToBackStack 调用在哪里?
  • 我为B 添加了代码 -> C -> E。谢谢。
  • 不幸的是,子片段不会自动处理返回按钮。您必须将 onBackPressed 委托给第一级 Fragment,然后让它递归检查它或任何子 Fragment 是否有需要弹出的返回堆栈条目。

标签: android android-fragments fragmentmanager


【解决方案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); } }

【讨论】:

  • 我需要在哪个片段中执行此操作,或者我需要在顶级活动中执行此操作?任何示例用法都会有所帮助。
  • 实际上案例 2 似乎是 Google 无法修复的错误! code.google.com/p/android/issues/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2014-01-02
  • 2012-11-10
  • 1970-01-01
相关资源
最近更新 更多