如何在 android 应用程序的导航抽屉菜单中放置缩进

how to place indent in navigation drawer menu in android application

我想创建像 Google 播放商店应用程序这样的菜单,如图所示。

我现在面临的困难是在菜单中放置缩进 space 以在应用程序中创建二级菜单。

这是我现在正在使用的代码。

acivity_main_drawer.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_camara"
            android:icon="@android:drawable/ic_menu_camera"
            android:title="Import" />
        <item
            android:id="@+id/nav_gallery"
            android:icon="@android:drawable/ic_menu_gallery"
            android:title="Gallery" />
        <item
            android:id="@+id/nav_slideshow"
            android:icon="@android:drawable/ic_menu_slideshow"
            android:title="Slideshow" />
        <item
            android:id="@+id/nav_manage"
            android:icon="@android:drawable/ic_menu_manage"
            android:title="Tools" />
    </group>

    <item android:title="Communicate">
        <menu>
            <item
                android:id="@+id/nav_share"
                android:icon="@android:drawable/ic_menu_share"
                android:title="Share" />
            <item
                android:id="@+id/nav_send"
                android:icon="@android:drawable/ic_menu_send"
                android:title="Send" />
        </menu>
    </item>

</menu>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>

MainActivity.java

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        navigationView = (NavigationView) findViewById(R.id.nav_view);

        //How to change elements in the header programatically
        View headerView = navigationView.getHeaderView(0);
        TextView emailText = (TextView) headerView.findViewById(R.id.email);
        emailText.setText("newemail@email.com");

        navigationView.setNavigationItemSelectedListener(this);

您可以将 Fragment 作为您的菜单,而不是使用新的 NavigationView,它简单、易于使用并保留设计指南。 在该片段中放置一个 RecyclerView 和 2 个 ViewType:1 个用于缩进项目,1 个用于不缩进的常规项目。

这是我菜单中的 RecyclerView 适配器示例。 这里我有两种项目类型——选择的和常规的。你可能有4种类型 - 常规项目 - 定期选择 - 子项目 - 子选择

 public class MenuItemAdapter extends RecyclerView.Adapter<MenuItemHolder> {

        private static final int VIEW_ITEM_SELECTED = 0;
        private static final int VIEW_ITEM_UNSELECTED = 1;

        private static final int MESSAGES_POSITION = 0;
        private static final int HOME_POSITION = 1;
        private static final int SEARCH_POSITION = 2;
        private static final int FAVORITES_POSITION = 3;


        private final ItemHolder.OnItemClickListener onItemClickListener;

        public final int[] MENU_TEXTS = {
                R.string.messages_menu_item_title,
                R.string.home_menu_item_title,
                R.string.search_menu_item_title,
                R.string.favorites_menu_item_title,

        };

        private static ArrayList<Integer> MENU_IMAGES;

        private int selectedPosition = 1;

        public MenuItemAdapter(ItemHolder.OnItemClickListener listener) {

            this.onItemClickListener = listener;
            MENU_IMAGES = new ArrayList<>();

            MENU_IMAGES.add(R.drawable.messages);
            MENU_IMAGES.add(R.drawable.home_yellow);
            MENU_IMAGES.add(R.drawable.search);
            MENU_IMAGES.add(R.drawable.favorites);

        }

        // Create new views (invoked by the layout manager)
        @Override
        public MenuItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // create a new view
            View v = null;
            switch (viewType){
                case VIEW_ITEM_SELECTED :
                   v = LayoutInflater.from
                           (parent.getContext()).inflate(R.layout.menu_item_selected, parent, false);
                    break;
                case VIEW_ITEM_UNSELECTED :
                    v = LayoutInflater.from
                            (parent.getContext()).inflate(R.layout.menu_item_unselected, parent, false);
            }

            return new MenuItemHolder(v, (position, view) -> {
                onItemClickListener.onItemClick(position, view);
                selectedPosition = position;
                MenuItemAdapter.this.notifyDataSetChanged();
            });
        }

        @Override
        public void onBindViewHolder(MenuItemHolder holder, int position) {
            holder.title.setText(MENU_TEXTS[position]);
            holder.image.setImageResource(MENU_IMAGES.get(position));
        }

        @Override
        public int getItemCount() {
            return MENU_TEXTS.length;
        }

        @Override
        public int getItemViewType(int position){
            if (position == selectedPosition){
                return VIEW_ITEM_SELECTED;
            }
            return VIEW_ITEM_UNSELECTED;
        }

        public void setHomePosition(){
            selectedPosition = HOME_POSITION
            notifyItemChanged(selectedPosition);
        }

        ...