我有一个带导航抽屉的应用程序,它正在切换片段。从其中一个片段中,我正在召唤一个新的活动。当我点击这个活动(在工具栏中)时,我想回到之前选择的片段,但它会让我回到第一个片段。我将我的片段添加到后台堆栈,所以这不应该是一个问题。
这是我已经尝试过的:
我在第二个活动中覆盖了onBackPressed方法,如下所示:
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
this.finish();
} else {
getFragmentManager().popBackStack();
}
}
它不起作用。我还在onsaveinstancestate方法中保存了当前片段的索引并检索它但结果相同。我也尝试过总是将当前片段放在变量中并尝试重新显示它但仍然不起作用。还有什么我可以尝试的吗?
有趣的事实:如果我按下底部面板,它实际上会回到之前的片段。
编辑:这是我执行此操作的代码:
private void replaceFragment(Fragment fragment)
{
if (fragment != null)
{
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction()
.replace(R.id.main_content, fragment)
.addToBackStack(null)
.commit();
}
}
如果savedInstanceState为null,我只添加第一个片段,如下所示:
if (savedInstanceState == null) {
// first time
mTitle = getResources().getString(R.string.home);
replaceFragment(HomeFragment.newInstance());
}
是的,所有这些都是在onCreate()方法中完成的。
答案 0 :(得分:3)
我有同样的问题并得到修复。你唯一需要做的就是 覆盖方法" onOptionsItemSelected"在活动中:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
android.R.id.home是你菜单中的第一个片段。
答案 1 :(得分:1)
尝试
getFragmentManager().popBackStackImmediate();
它对我有用。
答案 2 :(得分:1)
我倾向于做的是这个
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
this.finish();
} else {
super.onBackPressed(); //replaced
}
}
这样它就可以自己处理片段内容,但是当没有片段可以返回时,它就会完成活动。
编辑:向上导航可以重新创建您之前的活动,即使它已经存在。为防止这种情况发生,请在Up
中重新定义onOptionsItemSelected
导航事件,如下所示:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent parentIntent = NavUtils.getParentActivityIntent(this);
if(parentIntent == null) {
finish();
return true;
} else {
parentIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(parentIntent);
finish();
return true;
}
}
return super.onOptionsItemSelected(item);
}
答案 3 :(得分:0)
对不起,我没有足够的声誉来发表评论。所以我不得不猜。我曾经遇到过同样的问题。
听起来像是与活动生命周期相关的问题(http://developer.android.com/reference/android/app/Activity.html#ProcessLifecycle)。请务必仅添加您的第一个片段一次,因为您的活动的片段管理器能够处于生命周期。
因此,将第一个片段添加到片段管理器的语句应该被if (savedInstanceState == null) { ... }
包围。
答案 4 :(得分:0)
When you call an activity from other activity's fragment, then the previous activity's instance state that is the calling activity which was having fragment's instance state will be saved in stack...so all u need to do is finish the called activity and u will have the fragment from which you called your second activity.
@Override
public void onBackPressed() {
finish();
}
答案 5 :(得分:0)
我知道,人们仍在努力帮助我。这个答案帮助我解决了我的问题:Android - Navigation Up from Activity to Fragment
答案 6 :(得分:0)
在活动中覆盖onOptionsItemSelected
方法,如下所示,
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
答案 7 :(得分:0)
当您从Fragment调用新活动时,您应该写:
Intent intent = new Intent(getFragment().getContext(),NewActivity.class);
getFragment().getContext().startActivity(intent);
FragmentManager fm = CurrentFragment.getActivity().getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.addToBackStack(CurrentFragment.class.getName()).commit();
fm.executePendingTransactions();
它对我有用。