让我们再回到previous片段无法正常工作 [英] Going back to previous fragment not working correctly
问题描述
我使用的是抽屉式导航栏,当我选择一个项目,它正确替换我选择了一个previous片段,但如果我打开一个又一个,然后单击后退按钮,它去previous活动,而不是previous片段,什么是错的,它是这样做的?
私人无效选择信息(INT位置){
片段newFragment;
FragmentTransaction交易= getFragmentManager()调用BeginTransaction()。
开关(位置){
情况下0:
//更新
newFragment =新UpdateFragment();
transaction.replace(R.id.content_frame,newFragment);
transaction.addToBackStack(NULL);
器transaction.commit();
listView.setItemChecked(位置,真正的);
的setTitle(navigationDrawerItems [位置]);
打破;
情况1:
//地图
newFragment =新TimetableFragment();
transaction.replace(R.id.content_frame,newFragment);
transaction.addToBackStack(NULL);
器transaction.commit();
listView.setItemChecked(位置,真正的);
的setTitle(navigationDrawerItems [位置]);
打破;
案例2:
//时刻表
newFragment =新TimetableFragment();
transaction.replace(R.id.content_frame,newFragment);
transaction.addToBackStack(NULL);
器transaction.commit();
listView.setItemChecked(位置,真正的);
的setTitle(navigationDrawerItems [位置]);
打破;
案例3:
//笔记
newFragment =新TimetableFragment();
transaction.replace(R.id.content_frame,newFragment);
transaction.addToBackStack(NULL);
器transaction.commit();
listView.setItemChecked(位置,真正的);
的setTitle(navigationDrawerItems [位置]);
打破;
情况4:
//关于
newFragment =新AboutFragment();
transaction.replace(R.id.content_frame,newFragment);
transaction.addToBackStack(NULL);
器transaction.commit();
listView.setItemChecked(位置,真正的);
的setTitle(navigationDrawerItems [位置]);
打破;
情况5:
//设置
newFragment =新SettingsFragment();
transaction.replace(R.id.content_frame,newFragment);
transaction.addToBackStack(NULL);
器transaction.commit();
listView.setItemChecked(位置,真正的);
的setTitle(navigationDrawerItems [位置]);
打破;
}
//listView.setItemChecked(position,真正的);
//的setTitle(navigationDrawerItems [位置]);
drawerLayout.closeDrawer(ListView控件);
}
您可以使用 getFragmentManager()。popBackStack()
方法 onBack pressed
:
@覆盖
公共无效onBack pressed(){
如果(getFragmentManager()getBackStackEntryCount()方式> 0){
getFragmentManager()popBackStack()。
。getFragmentManager()调用BeginTransaction()提交()。
}
其他{
super.onBack pressed();
}
}
不要忘记添加片段BackStack这样的:
transaction.addToBackStack(NULL);
修改
要显示动作条的当前片段的名称,你可以得到它在<code> onResume 您FragmentActivity的:
@覆盖
保护无效onResume(){
// TODO自动生成方法存根
super.onResume(); FragmentManager fragManager = this.getSupportFragmentManager();
诠释计数= this.getSupportFragmentManager()getBackStackEntryCount()。 //获取最后一个片段
片段片段= fragManager.getFragments()获得(计数大于0计数1:计数)。 //请与您可能片段类
如果(片段的instanceof OneFragment)
{
的setTitle(OneFragment);
}
否则,如果(片段的instanceof TwoFragment)
{
的setTitle(TwoFragment);
}
}
希望它可以帮助ツ
I am using a navigation drawer and when I select an item, it correctly replaces the previous fragment with the one I have selected, but if I open another one, and then click the back button, it goes to the previous activity instead of the previous fragment, what is wrong that it is doing this?
private void selectItem(int position) {
Fragment newFragment;
FragmentTransaction transaction = getFragmentManager().beginTransaction();
switch (position){
case 0:
//Update
newFragment = new UpdateFragment();
transaction.replace(R.id.content_frame, newFragment);
transaction.addToBackStack(null);
transaction.commit();
listView.setItemChecked(position, true);
setTitle(navigationDrawerItems[position]);
break;
case 1:
//Maps
newFragment = new TimetableFragment();
transaction.replace(R.id.content_frame, newFragment);
transaction.addToBackStack(null);
transaction.commit();
listView.setItemChecked(position, true);
setTitle(navigationDrawerItems[position]);
break;
case 2:
//Timetables
newFragment = new TimetableFragment();
transaction.replace(R.id.content_frame, newFragment);
transaction.addToBackStack(null);
transaction.commit();
listView.setItemChecked(position, true);
setTitle(navigationDrawerItems[position]);
break;
case 3:
//Notes
newFragment = new TimetableFragment();
transaction.replace(R.id.content_frame, newFragment);
transaction.addToBackStack(null);
transaction.commit();
listView.setItemChecked(position, true);
setTitle(navigationDrawerItems[position]);
break;
case 4:
//About
newFragment = new AboutFragment();
transaction.replace(R.id.content_frame, newFragment);
transaction.addToBackStack(null);
transaction.commit();
listView.setItemChecked(position, true);
setTitle(navigationDrawerItems[position]);
break;
case 5:
//Settings
newFragment = new SettingsFragment();
transaction.replace(R.id.content_frame, newFragment);
transaction.addToBackStack(null);
transaction.commit();
listView.setItemChecked(position, true);
setTitle(navigationDrawerItems[position]);
break;
}
//listView.setItemChecked(position, true);
//setTitle(navigationDrawerItems[position]);
drawerLayout.closeDrawer(listView);
}
You can use getFragmentManager().popBackStack()
method in onBackPressed
:
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStack();
getFragmentManager().beginTransaction().commit();
}
else {
super.onBackPressed();
}
}
Don't forget to add the fragment in BackStack like :
transaction.addToBackStack(null);
Edit :
To show the current fragment name in actionbar, you can get it on onResume
of your FragmentActivity :
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
FragmentManager fragManager = this.getSupportFragmentManager();
int count = this.getSupportFragmentManager().getBackStackEntryCount();
// Fetch last fragment
Fragment fragment = fragManager.getFragments().get(count>0?count-1:count);
// Check with your possible Fragment class
if( fragment instanceof OneFragment)
{
setTitle("OneFragment");
}
else if(fragment instanceof TwoFragment)
{
setTitle("TwoFragment");
}
}
Hope it helps ツ
这篇关于让我们再回到previous片段无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!