Destroyed fragment recreated and redestroyed when restarting the app

自闭症网瘾萝莉.ら 提交于 2019-12-11 14:27:47

问题


I'm trying do understand the lifecycle of Fragment.

I have a MainActivity, with a layout including two FrameLayout to load Fragments, one for a top bar with a vertical menu, another one for the content.

When I start the app, an instance of HomeFragment is loaded in the content FrameLayout container. Then when I click on a button in the menu, an instance of SomeFragment replaces it.

When on the SomeFragment content, I click on the device's Home button, and all the visible Fragment (i.e. the TopBarFragment and the SomeFragment) are destroyed and detached from the MainActivity, i.e. onDestroyView, onDestroy and onDetach are called for both.

Now when I restart the app, the TopBarFragment and the SomeFragment are created and destroyed (full lifecycle from onAttach to onDetach) and then the TopBarFragment and the HomeFragment are created, as expected from the code in the MainActivity's onCreate.

Why are the TopBarFragment and the SomeFragment, i.e. the latest visible Fragment before clicking on the device's Home button, recreated and destroyed before executing what's in the MainActivity's onCreate?

Note: in order to test my app I checked the option Don't keep activities in my device's developer options.

MainActivity.java

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);     

        setContentView(R.layout.main);      

        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();

        Fragment homeFragment = new HomeFragment();
        fragmentTransaction.replace(R.id.content_container, homeFragment, "");

        Fragment topBarFragment = new TopBarFragment();
        fragmentTransaction.replace(R.id.top_bar_container, topBarFragment, "top_bar_fragment");

        fragmentTransaction.commit();
    }
}

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/content_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="44dp" />

    <FrameLayout
        android:id="@+id/top_bar_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipChildren="false" />

</RelativeLayout>

TopBarFragment.java

public class TopBarFragment extends Fragment{   

    private int mSelectedMenuOption = 0;

    private LinearLayout mVerticalMenu;

    private Boolean mMenuIsOpen = true;

    private ImageButton btn_01, btn_02; // there are more


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        return inflater.inflate(R.layout.top_bar, container, false);
    }

    @Override
    public void onActivityCreated (Bundle savedInstanceState){

        super.onActivityCreated(savedInstanceState);

        btn_01 = (ImageButton) getView().findViewById(R.id.btn_01);
        btn_02 = (ImageButton) getView().findViewById(R.id.btn_02);

        btn_01.setOnClickListener(mButtonClickListener);
        btn_02.setOnClickListener(mButtonClickListener);

        mVerticalMenu = (LinearLayout) getView().findViewById(R.id.vertical_menu);

        toggleMenu(0);

        Button btn_menu = (Button) getView().findViewById(R.id.btn_menu);
        btn_menu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // toggle vertical menu             

            }
        });
    }


    private OnClickListener mButtonClickListener = new OnClickListener()
    {

        @Override
        public void onClick(View v) {

            /* ... */

            if(!v.isSelected()){

                FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();

                switch(v.getId()){

                case R.id.btn_01:

                    Fragment homeFragment = new HomeFragment();     
                    fragmentTransaction.replace(R.id.content_container,homeFragment, "");
                    fragmentTransaction.commit();

                    break;

                case R.id.btn_02:

                    Fragment someFragment = new SomeFragment();     
                    fragmentTransaction.replace(R.id.content_container, someFragment, "");
                    fragmentTransaction.commit();

                    break;      
                }
            }
        }
    };    
}

SomeFragment

public class SomeFragment extends Fragment{

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        ((TopBarFragment)getActivity().getSupportFragmentManager().findFragmentByTag("top_bar_fragment")).setSelectedButton(1);

        return inflater.inflate(R.layout.some_fragment, container, false);
    }
}

来源:https://stackoverflow.com/questions/16316802/destroyed-fragment-recreated-and-redestroyed-when-restarting-the-app

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!