有关片段的设置,请参阅this问题:
| 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);
}
我使用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。
我有以下问题:
答案 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);
}
}