gpt4 book ai didi

android - onBackPressed() popBackStack 问题

转载 作者:行者123 更新时间:2023-11-30 02:27:56 30 4
gpt4 key购买 nike

我在 SO 上看到了许多 popbackstack 问题,根据我的代码,我尝试做的事情看起来应该可行。

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content_frame, new MainFragment());
ft.addToBackStack("Attend"); //here is the add to backstack
ft.commit();

}

这显示了我的空白布局中的主要 fragment 。

稍后我有一个 onOptionsItemSelected 启动一个新 fragment 。

FragmentManager fm1 = getFragmentManager();
FragmentTransaction ft1 = fm1.beginTransaction();
ft1.replace(R.id.content_frame, new ServiceFragment());
ft1.addToBackStack("ServiceTimes");
ft1.commit();
return true;

这个 fragment 出现了。这是问题开始的地方。我按下后退按钮希望返回到主要 fragment 。

@Override
public void onBackPressed() {
FragmentManager fm = getFragmentManager();
if(fm.getBackStackEntryCount() > 0) {
Toast.makeText(getApplicationContext(),"popstack",Toast.LENGTH_SHORT).show();
fm.popBackStackImmediate("Attend", fm.POP_BACK_STACK_INCLUSIVE);

} else {
Toast.makeText(getApplicationContext(),"Super",Toast.LENGTH_SHORT).show();
super.onBackPressed();
}
}

我添加了一个 Toast 弹出窗口来告诉我发生了什么,当按下后退按钮时,我得到一个空白屏幕,上面有“popstack”Toast 消息(告诉我“if”语句是正确的)。当我再次点击它时我得到“ super ”(这又是我所期望的)。

我不明白为什么我的代码不会返回到主要 fragment ?

最佳答案

需要记住的关键是,返回堆栈包含事务,而不是 fragment 。

因为您使用的是 POP_BACK_STACK_INCLUSIVE 标志,当您点击后退按钮时,名称为 "Attend" 的事务也会被弹出(即撤消)。因为此事务以编程方式添加了您的第一个 fragment ,所以您将返回到 Activity 的初始状态(容器中没有 ID 为 content_frame 的 fragment )。

适当的解决方案完全取决于您要实现的目标(可以添加多少 fragment ,您是否总是希望在返回时返回到第一个 fragment 等)您可能需要考虑不添加初始事务到后栈。或者您可以添加它,但不使用 inclusive 标志,并且仅在返回堆栈条目计数大于 1 时才使用您的自定义 onBackPressed 逻辑。

关于android - onBackPressed() popBackStack 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27670571/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com