Android 具有多个片段的单个活动,典型场景。努力达到期望的行为

Android 具有多个片段的单个活动,典型场景。努力达到期望的行为,android,android-fragments,Android,Android Fragments,我有一个应用程序在给定时间运行一个包含多(2)个片段的单个活动。我在左边有一个片段,它的功能是作为一个菜单来显示哪个片段 显示在右侧 例如,让我们假设菜单由不同的运动组成;足球、篮球、棒球、滑雪等。当用户选择一项运动时,右侧会显示一个包含特定运动详细信息的片段 我已经将我的应用程序设置为在大布局和小布局景观中同时显示两个片段。然而,在小肖像布局中,在给定时间仅显示一个片段 想象一下;一个用户正在浏览应用程序的布局小景观(一次两个片段),并选择一项运动,足球。在他选择篮球后不久。如果他现在选择旋转

我有一个应用程序在给定时间运行一个包含多(2)个片段的单个活动。我在左边有一个片段,它的功能是作为一个菜单来显示哪个片段 显示在右侧

例如,让我们假设菜单由不同的运动组成;足球、篮球、棒球、滑雪等。当用户选择一项运动时,右侧会显示一个包含特定运动详细信息的片段

我已经将我的应用程序设置为在大布局和小布局景观中同时显示两个片段。然而,在小肖像布局中,在给定时间仅显示一个片段

想象一下;一个用户正在浏览应用程序的布局小景观(一次两个片段),并选择一项运动,足球。在他选择篮球后不久。如果他现在选择旋转到布局小肖像(一次一个片段),我希望发生以下情况:

篮球片段应该是可见的,但是如果他按下后退按钮,他应该返回菜单,而不是足球片段(!),默认情况下,足球片段是后堆栈中的前一个片段

我目前已经解决了这个问题,如下所示:

....

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // static fragments
    if(menuFragment == null) menuFragment = new MenuFragment();
    if(baseFragment == null) baseFragment = new TimerFragment(); // default content fragment

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

    // Determine what layout we're in..
    if(app().getLayoutBehavior(this) == LayoutBehavior.SINGLE_FRAGMENT) {
    // We are currently in single fragment mode

        if(savedInstanceState != null) {

            if(!rotateFromSingleToDual) {
                // We just changed orientation from dual fragments to single fragment!

                // Clear the entire fragment back stack
                for(int i=0;i<getSupportFragmentManager().getBackStackEntryCount();i++) {
                    getSupportFragmentManager().popBackStack();
                }

                ft.replace(R.id.fragmentOne, menuFragment); // Add menu fragment at the bottom of the stack
                ft.replace(R.id.fragmentOne, baseFragment);
                ft.addToBackStack(null);
                ft.commit();
            }

            rotateFromSingleToDual = true;
            return;
        }

        rotateFromSingleToDual = true;

        ft.replace(R.id.fragmentOne, menuFragment);
    } else if(app().getLayoutBehavior(this) == LayoutBehavior.DUAL_FRAGMENTS) {
    // We are now in dual fragments mode

        if(savedInstanceState != null) {

            if(rotateFromSingleToDual) {
                // We just changed orientation from single fragment to dual fragments!
                ft.replace(R.id.fragmentOne, menuFragment);
                ft.replace(R.id.fragmentTwo, baseFragment);
                ft.commit();
            }

            rotateFromSingleToDual = false;
            return;
        }

        rotateFromSingleToDual = false;

        ft.replace(R.id.fragmentOne, menuFragment);
        ft.replace(R.id.fragmentTwo, baseFragment);
    }

    ft.commit();
}
。。。。
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//静态碎片
如果(menuFragment==null)menuFragment=new menuFragment();
if(baseFragment==null)baseFragment=new TimerFragment();//默认内容片段
FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.transition\u FRAGMENT\u OPEN);
//确定我们的布局。。
if(app().getLayoutBehavior(this)=LayoutBehavior.SINGLE_片段){
//我们目前处于单片段模式
如果(savedInstanceState!=null){
如果(!rotateFromSingleToDual){
//我们刚把方向从双碎片改为单碎片!
//清除整个片段返回堆栈

对于(int i=0;i来说,实现此场景的一种常见方法是仅在显示多个片段的模式下使用片段堆栈。在单片段模式下,启动一个新活动,唯一的任务是显示单个片段并利用活动后堆栈

在您的情况下,您只需记住当前选择的旋转点,即可在启动新活动时将其设置为参数

这里的解释更好:-


希望对您有所帮助。

您是否尝试过使用PopBackbackImmediate来查看这是否对您的异常有帮助?谢谢!这非常有帮助:)