0

我正在尝试了解Fragment.

我有一个MainActivity, 布局包括两个FrameLayout要加载Fragments,一个用于带有垂直菜单的顶部栏,另一个用于内容。

当我启动应用程序时,HomeFragment会在内容FrameLayout容器中加载一个实例。然后,当我单击菜单中的按钮时,会SomeFragment替换它的实例。

SomeFragment内容上,我单击设备的 Home 按钮,所有可见的Fragment(即TopBarFragmentSomeFragment)都被销毁并与MainActivityie分离onDestroyViewonDestroy并且onDetach两者都被调用。

现在,当我重新启动应用程序时,TopBarFragmentSomeFragment创建和销毁 and (从onAttach到的完整生命周期onDetach),然后创建TopBarFragmentand ,正如'sHomeFragment中的代码所预期的那样。MainActivityonCreate

为什么TopBarFragmentSomeFragment,即Fragment在点击设备的主页按钮之前可见的最新版本,在执行MainActivity' 中的内容之前重新创建和销毁onCreate

注意:为了测试我的应用程序,我检查了Don't keep activities我设备的开发者选项中的选项。

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();
    }
}

主要的.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;      
                }
            }
        }
    };    
}

一些片段

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);
    }
}
4

0 回答 0