以编程方式返回到Backstack中的上一个片段

问题描述 投票:193回答:8

假设我有一个以编程方式添加了片段的活动:

private void animateToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}

返回到可见的上一个片段的最佳方法是什么?

我发现Trigger back-button functionality on button click in Android,但我在想模拟后退键事件不是正确的方法(我也无法让它工作):

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));

打电话给finish()只关闭了我不感兴趣的活动。

有没有更好的方法来解决这个问题?

android android-fragments back-stack
8个回答
328
投票

看看getFragmentManager().popBackStack()方法(有几种可供选择)

http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack()


122
投票

要详细说明提供的其他答案,这是我的解决方案(放在一个活动中):

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();  
    }
}

25
投票

当我们更新/添加片段时,

应该包括.addToBackStack()

getSupportFragmentManager().beginTransaction()
    .add(detailFragment, "detail") // Add this transaction to the back stack (name is an optional name for this back stack state, or null).
    .addToBackStack(null)
    .commit();

之后如果我们给getFragments.popBackStackImmediate()将返回true,如果我们添加/更新片段,然后返回到当前屏幕。


8
投票

将这些行添加到onBackPressed()方法中。如果你在后台堆栈上有任何片段,popBackStackImmediate()方法会让你回到上一个片段

if(getFragmentManager().getBackStackEntryCount() > 0){
     getFragmentManager().popBackStackImmediate();
}
else{
    super.onBackPressed();
}

`


4
投票

当您想要在主片段中按下后关闭应用程序时,此解决方案适用于基于底部栏的片段导航。

另一方面,当您打开我的代码中定义为“DetailedPizza”的辅助片段(片段中的片段)时,它将返回主片段的先前状态。干杯!

背面的内部活动把这个:

Fragment home = getSupportFragmentManager().findFragmentByTag("DetailedPizza");

if (home instanceof FragmentDetailedPizza && home.isVisible()) {
    if (getFragmentManager().getBackStackEntryCount() != 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
} else {
    //Primary fragment
    moveTaskToBack(true);
}

然后像这样启动另一个片段:

Fragment someFragment = new FragmentDetailedPizza();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
transaction.addToBackStack("DetailedPizza");
transaction.commit();

1
投票

使用以下代码以编程方式返回上一个片段。

if ( getFragmentManager().getBackStackEntryCount() > 0) 
{
          getFragmentManager().popBackStack();
          return;
}
super.onBackPressed();

1
投票

要使该片段再次出现,只需将该片段添加到您想要返回的backstack,例如:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Fragment fragment = new LoginFragment();
        //replacing the fragment
        if (fragment != null) {
            FragmentTransaction ft = ((FragmentActivity)getContext()).getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_frame, fragment);
            ft.addToBackStack("SignupFragment");
            ft.commit();
        }
    }
});

在上面的例子中,当LoginFragment被按下时,我打开Button button,现在用户在SignupFragment。因此,如果addToBackStack(TAG)被调用,TAG = "SignupFragment",那么当在LoginFragment按下后退按钮时,我们回到SignUpFragment

快乐的编码!


0
投票

通过在最后一个片段上添加fragment_tran.addToBackStack(null),我能够回到最后一个片段。

添加新片段:

view.findViewById(R.id.changepass).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.container, new ChangePassword());
            transaction.addToBackStack(null);
            transaction.commit();
        }
    });

0
投票

试试以下代码:

@Override
    public void onBackPressed() {
        Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.container);
        if (myFragment != null && myFragment instanceof StepOneFragment) {
            finish();
        } else {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                getSupportFragmentManager().popBackStack();
            } else {
                super.onBackPressed();
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.