如何回到以前的片段上按个别片段的手动后退按钮?(how to go back to previous

2019-07-18 02:38发布

我只有一个activity和多个fragments在我的应用程序。

两个主要片段A(左)和B(右)。

Fragment A1 called from A

B1 called from B

B2 called from B1

所有fragments有个别后退按钮。

所以,当我按下背部的按钮fragment A1,它应该回到A,同样,当返回从B2按钮被按下,B1出现,从B1B等。

如何实现这种类型的功能?

Answer 1:

public void onBackPressed()
{
    FragmentManager fm = getActivity().getSupportFragmentManager();
    fm.popBackStack();
}


Answer 2:

我刚才已经实施了类似的情况。

活动“A” - >通话片段“A1”,然后点击菜单项,它调用片段“A2”,如果用户按下回从“A2”按钮,这又回到了“A1”,如果用户按下从“A1”回之后,它完成的活动“A”并返回。

看到下面的代码:

活性'A' - onCreate()方法:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activityA);

    if (savedInstanceState == null) {
        Fragment fragInstance;

        //Calling the Fragment newInstance Static method
        fragInstance = FragmentA1.newInstance();

        getFragmentManager().beginTransaction()
                .add(R.id.container, fragInstance)
                .commit();
    }
}

片段:A1:

我用新片段替换现有的片段时,菜单项的点击动作发生:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_edit_columns) {
        //Open the Fragment A2 and add this to backstack
        Fragment fragment = FragmentA2.newInstance();
        this.getFragmentManager().beginTransaction()
                .replace(R.id.container, fragment)
                .addToBackStack(null)
                .commit();

        return true;
    }
    return super.onOptionsItemSelected(item);
}

活性'A' - onBackPressed()方法:

由于所有的片段有一个父活动(这是“A”)时,onBackPressed()方法,可以弹出碎片如果有任何存在或只是回到以前的活动。

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    }
    else {
        getFragmentManager().popBackStack();
    }
}

如果您正在寻找内部片段嵌入片段,请参考链接: http://developer.android.com/about/versions/android-4.2.html#NestedFragments



Answer 3:

@ trueblue的回答让我用一个小的,但恼人的问题去。 当只有一个在堆栈中的片段,你按返回键,这架被删除,应用程序保持活跃,一个空白屏幕。 用户需要按后退按钮一次退出应用程序。 我修改了原来的代码如下,以处理这种情况

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    }
    else if(getFragmentManager().getBackStackEntryCount() == 1) {
        moveTaskToBack(false);
    }
    else {
        getFragmentManager().popBackStack();
    }
}

当只有1片段在堆栈中,我们基本上是告诉机器人移动的整个应用程序来备份。

更新(和可能是一个更好的答案)

所以做一些解决这个更多的阅读后,我发现,你可以添加片段经理的交易来支持栈 ,然后机器人自动和期望的方式处理回压。 下面的代码片段展示了如何做到这一点

Fragment fragment; //Create and instance of your fragment class here
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null);
fragmentTransaction.commit();
fragmentTransaction.addToBackStack(null);

最后一行显示了如何添加一个事务回堆栈。 这解决了背压问题在除一个大多数情况下片段。 如果你继续按后退按钮,那么最终你会当只有一个在后面堆片段到达一个点。 在这一点上,你会想要做的两两件事之一

  1. 移除该活动外壳从其中活动运行的任务的背面叠层的片段。 这是因为你不想用空白活动结束
  2. 如果活动是在任务后面堆唯一的活动,然后按任务在后台。

就我而言,那是后来的,所以我修改了覆盖onBackPressed从我以前的答案看起来像下面的方法

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 1) {
        moveTaskToBack(false);
    }
    else {
        super.onBackPressed();
    }
}

此代码是简单,因为它具有较少的逻辑,它比我们的自定义代码依赖于框架。 遗憾的是我没能实现代码,第一种情况下,我也没必要。



Answer 4:

做就是了

getActivity().getFragmentManager().popBackStack();


Answer 5:

你必须实现自己的堆栈中实现作为解释在这里。

您可以拨打popFragments()当你在一个片段点击后退按钮,并调用pushFragments()每当你从一个片段导航到其他。



Answer 6:

试试这个,它为我工作。

public void onBackPressed() {
    if (mainLayout.isMenuShown()) {
        mainLayout.toggleMenu();
    } else {
        FragmentManager fm = getSupportFragmentManager();
        Log.print("back stack entry", fm.getBackStackEntryCount() + "");

        if (fm.getBackStackEntryCount() > 1) {
            fm.popBackStack();
            // super.onBackPressed();
            // return;
        } else {
            if (doubleBackToExitPressedOnce) {
                fm.popBackStack();
                super.onBackPressed();
                return;
            }

            this.doubleBackToExitPressedOnce = true;
            Toast.makeText(this, "Press one more time to exit",
                    Toast.LENGTH_SHORT).show();

            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() {

                    doubleBackToExitPressedOnce = false;
                }
            }, 3000);

        }
    }
}


Answer 7:

后退按钮的顺序,其中被碎片穿越加入到堆栈中 。 这是作为默认导航功能。 现在,如果你想要去的特定片段,您可以显示它从堆栈中。



Answer 8:

您可以通过添加标签处理它backStack 。 在这里查看我的回答:

https://stackoverflow.com/a/19477957/1572408

希望能帮助到你



Answer 9:

@Override
public void onResume() {

    super.onResume();

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){

                // replace your fragment here

                return true;

            }

            return false;
        }
    });
}

//编码愉快



Answer 10:

如果按回的图像,你必须首先创建方法是这样

private void Backpresses() {
    getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.contant_main, new Home()).commit();
}

那么你有当你按下背面图像这样叫..

 back.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   Backpresses();

                }
            });

它的工作对我罚款。



文章来源: how to go back to previous fragment on pressing manually back button of individual fragment?