【问题标题】:Fragment back stack, android?片段回栈,android?
【发布时间】:2015-04-07 05:04:34
【问题描述】:

我的活动由导航抽屉组成,目前在左侧菜单中有 5 个选项。这一切都在片段中打开。

我正在寻找一种方法来保留所有片段的堆栈,以便当用户按下后退按钮时,他会移动到上一个片段。

Like-Activity 由抽屉菜单组成,有 5 个选项 menu1、menu2、menu3、menu4、menu5 对应的片段 F1、F2、F3、F4、F5。

用户按下 menu1 他被转发到 F1 然后按menu2,然后按menu4。

当用户在 F4 并按下后,他应该被移动到 F2 而不是退出活动或应用程序。

如何实现以及首选示例或示例代码。

我目前正在使用此代码,但它对我没有帮助

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
       .replace(R.id.frame_container, fragment)
       .addToBackStack(null)
       .commit();

【问题讨论】:

标签: android fragment fragment-backstack


【解决方案1】:

我为您的查询找到了一些解决方法:

  1. 在代码中覆盖onBackPressed()

  2. 使用与维护的 backstack 相关的方法,其中包含您的所有片段交易

    public void onBackPressed(){
    
    FragmentManager fm = getFragmentManager();
    
        if (fm.getBackStackEntryCount() > 0) {
    
            Log.i("MainActivity", "popping backstack");
    
            fm.popBackStack();    // this will display last visible fragment
            getActinBar().setTitle(mTitle);    // save your title in some variable and restore here
    
        } else {
    
             Log.i("MainActivity", "nothing on backstack, calling super");
    
             super.onBackPressed();  // system will handle back key itself
    
        }
    
     }
    

参考答案:this

【讨论】:

  • 我在背压时丢失了片段标题。我如何保留这些?
  • 当您的片段可见时,您将片段标题保存在mTitle 并在您返回该片段时恢复它。我已经编辑了我的答案.. 添加一些逻辑来保存您的标题每个片段的
  • 因为它在onStop() 直到现在.. 所以当它从停止开始时它得到onCreate() 回调
  • 它不在 onStop() 它在 onPause()
  • 不。它不应该在onPause() 中。你检查过onPause()onStop() 中的日志吗?
【解决方案2】:

我曾经像下面这样替换 Fragment:

public void replaceFragment(Fragment fragment, boolean addToBackStack, int transition) {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.activity_main_relative_container, fragment, fragment.getClass().getName());
    ft.setTransition(transition);
    if (addToBackStack) {
        ft.addToBackStack(fragment.getClass().getName());
    }
    ft.commitAllowingStateLoss();
}

// While to replace Fragment
replaceFragment(mFragment, true, FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// False for not adding Fragment in back stack and true to add.

希望这会有所帮助。

【讨论】:

  • ft.commitAllowingStateLoss(); 为什么?虽然没有这个我遇到了问题,但那是因为我没有使用onPostResume()
  • 我在背压时丢失了片段标题。我如何保留这些?
  • @WISHI你可以在框架的onResume()设置标题
  • 在后按片段的 on create 被再次调用
  • 如果onCreate() 调用它意味着您的片段不在后台堆栈中。要设置标题,您也可以在onCreateView()onCreate() 中设置标题。
【解决方案3】:

你需要将fragment添加到backstack

private FragmentTransaction m_fragmentTransaction;
FragmentOne m_fragOne = new FragmentOne();
m_fragmentTransaction = m_fragmentManager.beginTransaction();
m_fragmentTransaction.replace(R.id.dl_flContainer, m_fragOne , FragmentOne.class.getSimpleName());
m_fragmentTransaction.addToBackStack(FragmentOne.class.getSimpleName());
        m_fragmentTransaction.commit();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多