为什么后退按钮关闭活动而不是反转片段事务?

时间:2014-05-02 03:54:22

标签: android android-fragments

主要活动使用此事务打开main_fragment:

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

    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.fragment_main_container, new MainFragment())
                .commit();
    }

然后我用另一个片段替换那个片段:

// method to handle Conversions button click
public void addConversionsFragment (View v) {
    // replace the main fragment with the conversion fragment
    UnitConversionFragment newFragment = new UnitConversionFragment();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    // Replace whatever is in the fragment_container view with this fragment,
    transaction.replace(R.id.fragment_main_container, newFragment);
    // and add the transaction to the back stack so the user can navigate back
    transaction.addToBackStack(null);
    // Commit the transaction
    transaction.commit(); 
}

最初,我使用support.v4.app.fragment,一切都按预期工作(第二个片段中的后退按钮将弹出那个并返回MainFragment。但后来我决定实现{ {1}}其他地方,支持库似乎并不喜欢。所以我将整个项目转换为常规PreferenceFragment,删除所有支持导入,替换为常规导入,然后编辑所有app.fragmentgetSupportFragmentManager()等等。

好消息是getFragmentManager()运行良好,但是当我点击片段中的后退按钮时,它会关闭托管活动而不是撤消交易。

我做了很多搜索,似乎我正在正确地实现代码,但它只是没有像我期待的那样响应。是否有更多参与转换支持库?或者我错过了其他明显的东西?我看到很多答案覆盖了PreferenceFragment,但我真的不想这样做。

v4支持库和常规库之间是否存在一些根本区别,需要我以不同方式处理片段事务?

2 个答案:

答案 0 :(得分:0)

Preference Fragment有一些额外的逻辑来处理层次结构首选项。您可以将其配置为启动子片段屏幕,然后向后导航,如演示here

<PreferenceScreen android:title="Sub Preferences"
        android:fragment="com.example.SettingsDemo.SubPrefFragment"/>

对于普通片段,片段后栈在到达Activity后栈之前首先弹出。这是记录在案的内容。

android.app.Activityandroid.support.v4.app.FragmentActivity中的代码完全相同:

 /**
 * Take care of popping the fragment back stack or finishing the activity
 * as appropriate.
 */
public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}

没有按预期发生的唯一原因是其他东西消耗了&#34;背压&#34;,这可能发生在有3个级别的组件时:

  1. Activity位于ActivityGroup内。
  2. Fragment位于另一个Fragment内。 (为此,v4片段存在一些错误。)

答案 1 :(得分:-1)

因为在右侧,后退按钮会返回活动,而片段只是当前活动的叠加层。所以按下后退按钮即可。