【发布时间】:2016-02-19 05:29:18
【问题描述】:
fragment的设置请参考this问题:
| A | B |
↓
| C | D |
↓
| E |
我正在努力弄清楚为什么我的应用程序在按下使用 addToBackStack() 添加的片段上的后退按钮时退出。
根据回答,
案例 1:如果我使用 getSupportFragmentManager() 或 getFragmentManager():在我滑动到不同的选项卡并返回后,我的片段消失了。
案例 2: 如果我使用 getChildFragmentManager():我在使用 addToBackStack() 时动态地将 Fragment E 添加到 C,但是当我按下返回时,应用程序退出。期望它应该返回到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);
}
我在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 的原因是什么。根据我的理解,应该使用哪个 FM:getFM() 应该用于顶级,getChildFM() 应该用于向片段添加片段?
- 案例2为什么会退出App?我还需要做什么吗?
- 如何解决这个问题?卡了一段时间,非常感谢任何帮助。
【问题讨论】:
-
请显示您正在使用的代码,getChildFragmentManager() 用于获取管理片段内片段的FM。您可以在 B 中使用它来管理 C 和 D。getFragmentManager 用于管理整个 Activity 的片段,如果您在同一个 Activity 中让片段消失,则可能是您使用它。
-
我已经添加了标签设置代码,如果需要额外的,请告诉我。
-
您的 addToBackStack 调用在哪里?
-
我为
B添加了代码 ->C->E。谢谢。 -
不幸的是,子片段不会自动处理返回按钮。您必须将 onBackPressed 委托给第一级 Fragment,然后让它递归检查它或任何子 Fragment 是否有需要弹出的返回堆栈条目。
标签: android android-fragments fragmentmanager