【问题标题】:Fragment addToBackStack closing App片段 addToBackStack 关闭 App
【发布时间】:2013-09-23 16:04:53
【问题描述】:

我没有为我的问题找到任何解决方案。

我有几个片段(动态创建),但我的后退按钮根本不起作用, 按下它将关闭应用程序,无论片段是“活动”的。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {

case R.id.itemAdd:
FragmentTransaction tx = getFragmentManager().beginTransaction();
    Fragment fragment = new NeuesProduktFrag();

    tx.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right,
             R.anim.slide_in_left, R.anim.slide_out_right);
     tx.replace(R.id.main, fragment);
     tx.addToBackStack(null);
     tx.commit();
    return true;

一切正常,但在输入“NeuesProduktFrag”片段并按下后退按钮后,我的应用程序将关闭。在不同的按钮等中尝试过。 不需要覆盖 onBackPressed 对吗? addToBackStack 是否可以解决问题?

【问题讨论】:

  • addToBackStack 可能与问题无关,问题可能出在您的片段的 onResume 中。查看堆栈跟踪并找出问题所在。如果你也在这里发布它可能会有所帮助

标签: android fragment back-stack


【解决方案1】:

我挣扎了很久,这是我最终的代码:

@Override
public void onBackPressed() {

// initialize variables
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

// check to see if stack is empty
if (fm.getBackStackEntryCount() > 0) {          
    fm.popBackStack();
    ft.commit();    
}
else {
    if (this.lastBackPressTime < System.currentTimeMillis() - 4000) {
Toast.makeText(this, "Nochmal drücken zum Beenden!", 4000).show();
this.lastBackPressTime = System.currentTimeMillis();
} else{
        super.onBackPressed();
    }        
}
}

我在我的 FragmentActivity 中使用了它,并添加了一个双选项卡以最终关闭应用程序。

【讨论】:

    【解决方案2】:

    我猜在支持库的FragmentActivity 中使用getFragmentManager() 而不是支持库的getSupportFragmentManager() 时会出现问题。例如,当您想将PreferenceFragmentsetSupportActionBar() 放在一起时。

    我通过从android.app.Activity 复制粘贴onBackPressed() 实现并进行了一些更改,解决了我的ActionBarActivity 中的问题:

    @Override
    public void onBackPressed() {
        if (getFragmentManager().popBackStackImmediate()) return;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
            finish();
        else
            finishAfterTransition();
    }
    

    【讨论】:

      【解决方案3】:

      我的代码从 FragmentActivity 更改为 Activity。

      编辑:输入错误

      【讨论】:

      • 好吧,我没有使用 FrameActivity,我使用的是 FragmentActivity,它持有静态 Fragments 来显示 :)
      【解决方案4】:

      按返回键退出应用程序

      @Override
      public void onBackPressed() {
      
          // initialize variables
          FragmentManager fm = getSupportFragmentManager();
          FragmentTransaction ft = fm.beginTransaction();
      
          // check to see if stack is empty
          if (fm.getBackStackEntryCount() > 1) {
              fm.popBackStack();
              ft.commit();
          } else {
      
              if (backPressedTime + 2000 > System.currentTimeMillis()) {
                  backToast.cancel();
                  finishAffinity();
                  System.exit(1);
                  return;
              } else {
                  backToast = Toast.makeText(getBaseContext(), "press back again to exit", Toast.LENGTH_LONG);
                  backToast.show();
              }
              backPressedTime = System.currentTimeMillis();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多