web-dev-qa-db-ja.com

ナビゲーションドロアー:アイテムではなくグループにタイトルを追加する

Android Studioによって事前に作成された標準のナビゲーションドロワーがあり、それにいくつかのグループを追加したいと考えています。これから始めました。

<?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_mode_person"
            Android:icon="@drawable/ic_person_black_24dp"
            Android:title="Person" />
        <item
            Android:id="@+id/nav_mode_group"
            Android:icon="@drawable/ic_group_black_24dp"
            Android:title="Community" />
    </group>

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

</menu>

しかし、各グループにタイトルを付けることさえ可能であるならば、私が得なかったものは何ですか?つまり、Android:titleオプションが<item>s、ただし<group>sそして、アイテムをグループでラップしようとすると、厄介なエントリの動作が発生します。

Navigation Drawerに関するGoogleのデザインガイドラインを読みましたが、グループに独自の名前を付けるべきか、付けるべきではないのかという点を逃しました。これが私が達成したいことの写真です:

enter image description here

ランダムに追加せずに可能ですか<TextView>s?ちなみに、プログラムではなく、XMLでやりたいのです。

16

そうです、グループにタイトルを付けることはできません。唯一のオプションは、グループを<item>および<menu>タグに次のようにラップすることです

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

    <item Android:title="General">
        <menu>
            <group Android:checkableBehavior="single">
                <item
                    Android:id="@+id/nav_camera"
                    Android:icon="@drawable/ic_menu_camera"
                    Android:title="Import" />
                <item
                    Android:id="@+id/nav_gallery"
                    Android:icon="@drawable/ic_menu_gallery"
                    Android:title="Gallery" />
            </group>
        </menu>
    </item>

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

</menu>

このようなナビゲーションドロワーメニューが表示されます

Navigation Drawer

27
Saenic

また、Android:checkableBehavior="single"からのアイテムとFirst Categoryからのアイテムの2つが選択されないように、Second Categoryの外部グループが必要です。これが実際のコードです。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<group Android:checkableBehavior="single">
<item
    Android:title="First Category">
    <menu>
        <group
            Android:id="@+id/menu_top"
            Android:checkableBehavior="single">
            <item
                Android:id="@+id/id1"
                Android:icon="@drawable/drawable1"
                Android:title="Title1" />

            <item
                Android:id="@+id/id2"
                Android:icon="@drawable/drawable2"
                Android:title="Title2" />
        </group>
    </menu>
</item>
<item
    Android:title="Second Category">
    <menu>
        <group
            Android:id="@+id/menu_bottom"
            Android:checkableBehavior="single">
            <item
                Android:id="@+id/id3"
                Android:icon="@drawable/drawable3"
                Android:title="Title3" />

            <item
                Android:id="@+id/id4"
                Android:icon="@drawable/drawable4"
                Android:title="Title4" />
        </group>
    </menu>
</item>
</group>
</menu>
10
opticod

ここでは、メニューを作成する方法を明確に示します。

http://developer.Android.com/guide/topics/ui/menus.html

したがって、あなたのケースでは、この順序でリストを作成しますitem-> menu-> group。つまり、

 <item Android:title="Title">
     <menu>
         <group Android:checkableBehavior="single">
             <item Android:id="@+id/nav_share"
                Android:icon="@drawable/ic_menu_share"
                Android:title="Share" />
            <item
                Android:id="@+id/nav_send"
                Android:icon="@drawable/ic_menu_send"
                Android:title="Send" />
                .   .   .
                .   .   . 
5
ugur

xMLクラスを追加navigation_drawer_title

<?xml version="1.0" encoding="utf-8"?>
<TextView
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="wrap_content"
        Android:text="communicate"
        Android:layout_height="wrap_content"/>

navigationAdapterを次のように変更します

private static final int TYPE_HEADER = 0; 
    private static final int TYPE_ITEM = 1;
    private static final int TYPE_SEPARATOR = 2;
    private static final int TYPE_TITLE = 3;
    @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
        {
            View v = null;
            switch (viewType)
            {
                case TYPE_HEADER:
                    v = LayoutInflater.from(parent.getContext()).inflate(R.layout.navigation_drawer_header, parent, false); //Inflating the layout
                    break;
                case TYPE_ITEM:
                    v = LayoutInflater.from(parent.getContext()).inflate(R.layout.navigation_drawer_item, parent, false); //Inflating the layout
                    break;
                case TYPE_SEPARATOR:
                    v = LayoutInflater.from(parent.getContext()).inflate(R.layout.navigation_drawer_separator, parent, false); //Inflating the layout
                    break;

                case TYPE_TITLE:
                    v = LayoutInflater.from(parent.getContext()).inflate(R.layout.navigation_drawer_title, parent, false); //Inflating the layout
                    break;
            }
            return new ViewHolder(v, viewType); // Returning the created object

        }

そして

@Override
    public int getItemViewType(int position)
    {
        if (position == 0)
            return TYPE_HEADER;
        if (navMenuItems.get(position - 1).getItemType() == NavItemType.Group)
            return TYPE_SEPARATOR;
        if (navMenuItems.get(position - 2).getItemType() == NavItemType.Group)
            return TYPE_TITLE

        return TYPE_ITEM;
    }
0