片段中的onDestroyView在FragmentActivity中调用的finish()会杀死之前的活动

时间:2015-03-05 04:10:20

标签: android android-activity android-fragments

设定:

我有一个活动,有两个动态放置在framelayout内的片段。其中一个片段是一个带有以下onDestroyView实现的地图片段。

@Override
public void onDestroyView() {
    super.onDestroyView();
    try{
        MapFragment fragment = (MapFragment)getFragmentManager().findFragmentById(R.id.map);
        FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
        ft.remove(fragment);
        ft.commit();
    }catch(Exception e){
        Log.e("SomeTag", "someError");
    }
}

此外,我的Activity实现了onOptionsItemSelected,并在用户按下ActionBar中的主页按钮时调用finish()。

布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="MyActivity"
    android:padding="0dp"
    android:layout_margin="0dp">
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.v4.widget.DrawerLayout>

在活动中添加片段

private void addFragmentToView(Fragment fragment){
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    // Replace whatever is in the fragment_container view with this fragment,
    // and add the transaction to the back stack so the user can navigate back
    transaction.replace(R.id.fragment_container, fragment);
    transaction.addToBackStack(null);
    // Commit the transaction
    transaction.commit();
}

活动onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    switch (item.getItemId())
    {
        case android.R.id.home:
            finish();
            overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

问题: 当我在地图片段中,然后单击ActionBar的后退按钮时,活动会收到点击并调用finish()。然后地图片段的onDestroyView启动并尝试销毁片段。但是,会发生的情况是应用程序在此之前切换到活动,然后完全退出应用程序(因为我以前的活动是第一个活动)。

当我在我的其他片段中并执行完全相同的操作时,看不到此行为,但该片段不会在onDestroyView中删除。

问题: 处理这种情况并允许地图片段自我毁灭以及返回上一个活动的好方法是什么?

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为您没有将片段添加到后台堆栈  使用addToBackStack()添加后栈

getSupportFragmentManager().beginTransaction()
                           .add(detailFragment, "detail")
                           // Add this transaction to the back stack
                           .addToBackStack()
                           .commit();

http://developer.android.com/training/implementing-navigation/temporal.html