Android的 - 后退按钮和片段堆栈中不工作(Android - Back button and

2019-07-31 23:35发布

我正在开发一个燎FragmentActivity一个简单的基于片段的应用程序。 每个应用的“屏幕”被包含在一个片段和所有片段被添加到应用程序启动时容器布局。

// Set up fragments in Main Activity
fragMan = getFragmentManager();
FragmentTransaction ft = fragMan.beginTransaction();
ft.add(R.id.fragment_container, settingsFragment);
ft.add(R.id.fragment_container, mapFragment);
ft.add(R.id.fragment_container, tracksFragment);
ft.add(R.id.fragment_container, waypointsFragment);
ft.commit();

转变由隐藏当前可见片段,然后示出了适当的片段来实现。

ft = fragMan.beginTransaction();
ft.show(mapFragment);
ft.addToBackStack(null);
ft.commit();

这一切工作正常,但按下后退按钮时,应用程序退出,无论哪个屏幕是可见的还是什么以前的交易已被添加到后退堆栈。

我检查,以确保背部叠正确累积记录,并试图转型的方法,如更换片段而不是隐藏/显示他们,创造片段的新实例,而不是将它们存储在变量等。据许多不同的变化我可以告诉大家,我的代码匹配所有的教程和例子我能找到的,我还没有能够找到类似的问题任何类似的问题/例子,大概是因为标准的执行“只是工作”为他人。

我怀疑这可能是在应用层面的问题,例如在我的清单属性(我已经非常彻底的调查)或固有的东西,我的应用程序设置的方式,防止后退按钮正常工作。 我可以覆盖onBackPressed手工处理转变,但是这似乎是一个非常丑陋的解决方法。 任何想法,为什么这可能不会表现如预期? 顺便说一句,这是上运行果冻豆一台Nexus 7。

Answer 1:

检查是否正在使用,而不是活动FragmentActivity(从支持库)。 这将导致堆栈中和转型问题。



Answer 2:

我不知道这是否会解决你的问题,但我不认为你需要添加所有开始与片段。

我也注意到(至少与兼容性库)的替代方法似乎是非常错误,所以最好先删除现有的片段,然后添加新的。

下面是代码,我用它来改变一个片段位:

/**
 * Changes the detail fragment of this activity. This is how all content is presented in this app.
 * @param fragment
 * @param animated
 * @param addCurrentFragmentToBackStack
 */
private void changeDetailFragment(Fragment fragment,boolean animated,boolean addCurrentFragmentToBackStack)
{
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        if (animated)
            transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);

    Fragment currentFrag =  getSupportFragmentManager().findFragmentById(R.id.detailFragment);


    String fragName = "NONE";

    if (currentFrag!=null)
        fragName = currentFrag.getClass().getSimpleName();


    if (currentFrag != null)
    {

        transaction.remove(currentFrag);
    }


    transaction.add(R.id.detailFragment,fragment);


    if (addCurrentFragmentToBackStack)
    {
        Log.i("APP_NAME","Adding: " + fragName + " to the backstack");
        transaction.addToBackStack(null);
    }
    else
    {
        Log.i("APP_NAME","Not adding: " + fragName + " to the backstack");
    }



    transaction.commit();

}

希望这可以帮助。



Answer 3:

For me changing the version of appcompat to 27.1.1(As of 15/08/2018) worked. Turns out appcompat version v7:28.0.0-rc01 was the culprit.



文章来源: Android - Back button and fragment backstack not working