在Android中创建一个包含片段的菜单

在Android中创建一个包含片段的菜单,android,android-layout,android-fragments,Android,Android Layout,Android Fragments,我想要一个菜单,当活动开始时,显示一个带有选项列表的片段(MainFragment),例如,当单击此列表中的第一项时,MainFragment将滚动到屏幕的左侧,而新片段(OptionOneFragment)将从屏幕的右侧滚动。在选项片段中,顶部有一个按钮返回主片段,另一个与主选项菜单相关的“子选项”列表,单击任何选项都将打开其他活动 碎片之间的关系如下所示: MainFragment ListView Option1 - Slide out Main and Slid

我想要一个菜单,当活动开始时,显示一个带有选项列表的片段(MainFragment),例如,当单击此列表中的第一项时,MainFragment将滚动到屏幕的左侧,而新片段(OptionOneFragment)将从屏幕的右侧滚动。在选项片段中,顶部有一个按钮返回主片段,另一个与主选项菜单相关的“子选项”列表,单击任何选项都将打开其他活动

碎片之间的关系如下所示:

MainFragment
     ListView
        Option1 - Slide out Main and Slide in 
                        -OptionOneFragment
                             <- BackButton (With a Slide Out)
                             ListView
                                Option1_1 = opens ActivityA
                                Option1_2 = opens ActivityB

        Option2 - Slide out Main and Slide in 
                        -OptionTwoFragment (With a Slide Out)
                             <- BackButton
                             ListView
                                Option2_1 = opens ActivityC
                                Option2_2 = opens ActivityD

        Option3 - Slide out Main and Slide in 
                        -OptionThreeFragment (With a Slide Out)
                             <- BackButton
                             ListView
                                Option3_1 = opens ActivityE
                                Option3_2 = opens ActivityF
在我的MainFragment中,我调用了一个函数,该函数根据单击的项目更改布局(仅在项目0中,其他2个我还没有创建):


我以前见过这种我想要的菜单,但是当我尝试开发一个菜单时,我遇到了一些问题,比如如果应用程序因为任何原因崩溃,它就会破坏我所有的布局。我会用例子更好地解释…

您是否考虑过使用库来帮助您创建菜单?我试过Mike Penz的材料抽屉库,它非常适合快速设置菜单

有很多不同的预设风格,你可以选择,所以我相信你可以找到你喜欢的外观

    <?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context=".app.Activities.MainActivity">


    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="@dimen/activity_vertical_margin"
        android:id="@+id/fragmentContainer"
        android:layout_below="@id/toolbarMain">
    </FrameLayout>

</RelativeLayout>
<FrameLayout 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"
    tools:context=".app.Activities.MainActivity"
    android:background="@color/zxing_transparent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listViewMainMenu"
        android:background="#FFF"
        />
</FrameLayout>
<LinearLayout
    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"
    tools:context=".app.Activities.MainActivity"
    android:orientation="vertical"
    android:background="@color/zxing_transparent">

    <ImageView
        android:layout_width="@dimen/back_button_dimen_width"
        android:layout_height="@dimen/back_button_dimen_height"
        android:id="@+id/buttomBackToMainMenu"
        android:src="@drawable/ic_keyboard_backspace"
         />
    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listViewSubMenu"
        android:background="#FFF"
        />


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

            Fragment mainFragment = new MainFragment();
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.add(R.id.fragmentContainer, mainFragment, "MAIN_FRAGMENT");
            transaction.addToBackStack(null);
            transaction.commit();
}
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view =  inflater.inflate(R.layout.fragment_main, container, false);

        thisFragment = this;
        manager= this.getFragmentManager();

        listViewMainMenu =(ListView) view.findViewById(R.id.listViewMainMenu);

        menuList = new ArrayList<>();
        menuList.clear();

        menuList.add(0, "OptionOne");
        menuList.add(1, "OptionTwo");
        menuList.add(2, "OptionThree");

        menuAdapter = new MainMenuAdapter(getActivity(), menuList);

        listViewMainMenu.setAdapter(menuAdapter);

        listViewMainMenu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                switch (position){
                    case(0):
                        Shared.ShowFragment(manager, thisFragment, new OptionOneFragment(), 1);
                        break;
                    default:
                        break;
                }
            }
        });

        return view;
    }
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_option_one, container, false);

        thisFragment = this;
        manager = this.getFragmentManager();

        buttomBackToMenu = (ImageView) view.findViewById(R.id.buttomBackToMenu);
        listViewSubMenu = (ListView) view.findViewById(R.id.listViewSubMenu);

        menuList = new ArrayList<>();
        menuList.add(0,"Option1_1");
        menuList.add(1,"Option1_2");

        menuAdapter = new MainMenuAdapter(getActivity(),menuList);
        listViewSubMenu.setAdapter(menuAdapter);

        buttomBackToMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Shared.ShowFragment(manager, thisFragment, new MainFragment(), 0);
            }
        });

        listViewSubMenu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                switch (position){
                    case (0):
                        intent= new Intent(getActivity(), ActivityA.class);
                        break;
                    case (1):
                        intent = null;
                        break;
                }
                if(intent!= null)
                    getActivity().startActivity(intent);

            }
        });

        return view;
    }
public static void ShowFragment(FragmentManager manager, Fragment thisFragment, Fragment destinyFragment, int customTransactionType) {

        FragmentTransaction transaction = manager.beginTransaction();
        switch(customTransactionType){
            case (0):
                transaction.setCustomAnimations(R.anim.slide_out_left, R.anim.slide_in_right);
                break;
            case (1):
                transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
                break;
            default: break;
        }

        transaction.remove(thisFragment);
        transaction.add(R.id.fragmentContainer, destinyFragment);

        transaction.commit();
    }