【问题标题】:Adding Fragments to backstack将片段添加到后台堆栈
【发布时间】:2015-04-15 17:08:49
【问题描述】:

我正在尝试通过在按下单选按钮时切换片段来管理单个活动的片段。在每次替换操作中,我都调用 addToBackStack() 方法,但是当我按下返回按钮时,它会关闭活动而不是转到上一个片段。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_flow);
    radioGroup = (RadioGroup) findViewById(R.id.rdoGrp);
    rdBtnHome = (RadioButton) findViewById(R.id.rdBtnHome);
    rdBtnSearch = (RadioButton) findViewById(R.id.rdBtnSearch);
    rdBtnShoot = (RadioButton) findViewById(R.id.rdBtnShoot);
    rdBtnUser = (RadioButton) findViewById(R.id.rdBtnUser);
    rdBtnAlarm = (RadioButton) findViewById(R.id.rdBtnAlarm);
    homeFragment = new HomeFragment();
    searchFragment = new SearchFragment();
    userFragment = new UserFragment();
    shootFragment = new ShootFragment();
    alarmFragment = new AlarmFragment();


 getSupportActionBar().setDisplayOptions(android.support.v7.app.ActionBar.DISPLAY_SHOW_CUSTOM);
    getSupportActionBar().setCustomView(R.layout.actionbar);

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.frameLayoutMain, homeFragment);
    ft.addToBackStack(null);
    ft.commit();

    rdBtnHome.setChecked(true);


    // Creating once image loader configuration
    createImageLoaderConfiguration();

    // Defining footer radiogroup including radiogroup callback listener
    defineFooterRadioGroup();

    Log.d("Logged User", Me.meGetInstance().toString());
}


private void defineFooterRadioGroup() {


    radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            FragmentManager fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            switch (checkedId) {
                case R.id.rdBtnHome:
                    ft.replace(R.id.frameLayoutMain, homeFragment);
                    ft.addToBackStack(null);
                    ft.commit();
                    break;
                case R.id.rdBtnAlarm:
                    ft.replace(R.id.frameLayoutMain, alarmFragment);
                    ft.addToBackStack(null);
                    ft.commit();
                    break;
                case R.id.rdBtnSearch:
                    ft.replace(R.id.frameLayoutMain, searchFragment);
                    ft.addToBackStack(null);
                    ft.commit();
                    break;
                case R.id.rdBtnShoot:
                    ft.replace(R.id.frameLayoutMain, shootFragment);
                    ft.addToBackStack(null);
                    ft.commit();
                    break;
                case R.id.rdBtnUser:
                    ft.replace(R.id.frameLayoutMain, userFragment);
                    ft.addToBackStack(null);
                    ft.commit();
                    break;
            }

        }
    });

}

【问题讨论】:

  • 我猜你没有使用 fragmentactivity 并且在 onbackpressed 中没有实现 backstack 使用
  • @mlody991 我正在使用 ActionBarActivity,它扩展了 FragmentActivity。

标签: android android-fragments back-stack


【解决方案1】:

像这样将 popBackStack() 添加到 Activity 的 BackPressed 侦听器中......

 if (getSupportFragmentManager().getBackStackEntryCount() > 0) {

     getSupportFragmentManager().popBackStack();
 }

【讨论】:

    【解决方案2】:
    1. 您应该将 onBackPress() 方法覆盖到您的活动中。
    2. 您将从堆栈中获取一个片段,您可以从“getBackStackEntryCount();”方法中检索此值。
    3. 在退出应用程序之前检查堆栈的大小。

    【讨论】:

    • 假设我在 backStack 中看到了 3 笔交易,如何从堆栈中获取最新的交易并在 View 中重新创建它?以及如何减少从堆栈中提取的交易?
    • 您的实际场景有:- Activity ->fragment1 或 Activity -->Fragment2 或 Activity -->Fragment3 以及您真正想要的 int 这个:- Activity -->Fragment1 -->Fragment2 -- >片段3。仅当您将片段导航到下一个片段时,这才有可能。
    【解决方案3】:

    这是一种删除片段中包含代码的片段的方法。

    public void removeMe() {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        Fragment prevHistory = getFragmentManager()
                .findFragmentByTag("LOG_IN");
        if (prevHistory != null) {
            ft.remove(prevHistory);
        }
        ft.commit();
    
    }
    

    您需要调用 removeMe 方法。所以给后退按钮添加一个按键监听器。

    view.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if(keyCode==KeyEvent.KEYCODE_BACK){
                    removeMe();
                }
                return true;
            }
        });
    

    视图可以是任何东西。如果你想要一个全局的解决方案,视图就是片段的视图。

    要使此方法起作用,您需要在添加或替换片段时向片段事务添加标签。

    Fragment newFragment = new Fragment();
                ft.replace(R.id.fragment_container, newFragment, "The fragment tag goes here");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      相关资源
      最近更新 更多