web-dev-qa-db-ja.com

Androidのナビゲーションドロワー内に折りたたみ可能なメニューアイテムを追加するにはどうすればよいですか?

DrawerLayoutを囲むNavigationViewがあり、このレイアウトアクティビティは、アプリ内のすべてのアクティビティの共通ナビゲーションドロワーとして機能します。ナビゲーションビューでapp:menuのメニューリソースを提供しています。いくつかのメニュー項目がありますが、1つのメニュー項目を折りたたみ/拡張可能にしたいので、クリックすると2つのサブメニューが表示され、2回目のクリックで再び折りたたまれます。

<menu>内に別の<item>を追加することでサブメニューを追加しましたが、それを折りたたみ可能/拡張可能にすることはできません。

また、目的にExpandableListViewを使用したくありません。代わりに、メニューリソースファイルを調整するだけです。私を正しい方向に向けてください。 ExpandableListViewを使用して折りたたみ可能なリストアイテムのコード、ブログ、および例を見つけるためだけにGoogleを検索しましたが、デザインサポートライブラリのNavigationViewデザインウィジェットで作業する必要があります。

メニューファイルのコードは次のとおりです。

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">

<group Android:checkableBehavior="single">
    <item
        Android:id="@+id/nav_aboutus"
        Android:title="About Us" />

    <item
        Android:id="@+id/nav_faq"
        Android:title="FAQs" />
    <item
        Android:id="@+id/nav_share"
        Android:title="Share" />
    <item
        Android:id="@+id/nav_myaccount"
        Android:title="My Account" />
    <item
        Android:id="@+id/nav_legal"
        Android:title="Legal" >
        <menu>
                <item
                    Android:id="@+id/nav_tnc"
                    Android:title="Terms and Conditions" />
                <item
                    Android:id="@+id/nav_pp"
                    Android:title="Privacy Policy" />
            </group>
        </menu>
    </item>

</menu>

2つのサブメニュー項目「契約条件」、「プライバシーポリシー」を含む法的メニュー項目を拡張可能にしたい。

9
Kanwarbir Singh

ナビゲーションドロワー内で展開可能なリストビューを使用できますが、なぜ使用したくないのかわかりません。詳細については、こちらをご覧ください http://developer.Android.com/reference/Android/widget/ExpandableListView.html

ExpandableListViewを使用しないと主張する場合は、代わりに、その特定のアイテムのメニューのOnSelectを使用して自分で展開を設計します。なぜこれが必要なのかはわかりませんが、ホイールを再実装するだけです。

6
Ali Elgazar

expandableListViewを使用せずにこれを行うには、メニューレイアウトファイルに通常それらのメニュー項目を追加し、次のように表示するメニュー項目の項目クリックでそれらを非表示/表示するトリックがあります。

 public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.

        NavigationView nv= (NavigationView) findViewById(R.id.nav_view);
        Menu m=nv.getMenu();
        int id = item.getItemId();
        if (id == R.id.nav_posts) {
            boolean b=!m.findItem(R.id.nav_class).isVisible();
            //setting submenus visible state
            m.findItem(R.id.nav_class).setVisible(b);
            m.findItem(R.id.nav_dept).setVisible(b);
            m.findItem(R.id.nav_batch).setVisible(b);
            m.findItem(R.id.nav_campus).setVisible(b);
            return true;
        } else if (id == R.id.nav_walls) {
            boolean b=!m.findItem(R.id.nav_wall_events).isVisible();
            //setting submenus visible state
            m.findItem(R.id.nav_wall_events).setVisible(b);
            m.findItem(R.id.nav_wall_fun).setVisible(b);
            m.findItem(R.id.nav_wall_hadith).setVisible(b);
            m.findItem(R.id.nav_wall_news).setVisible(b);
            m.findItem(R.id.nav_wall_Poetry).setVisible(b);
            return true;
        } else if (id == R.id.nav_com) {

            m.findItem(R.id.nav_share).setVisible(false);
            m.findItem(R.id.nav_send).setVisible(false);

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

メニューレイアウトファイルは次のとおりです。

<?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_posts"
            Android:icon="@drawable/ic_menu_camera"
            Android:title="Posts" />

        <item
            Android:id="@+id/nav_class"
            Android:title="Class"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_dept"
            Android:title="Department"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_batch"
            Android:title="Batch"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_campus"
            Android:title="Campus"
            Android:visible="false" />


        <item
            Android:id="@+id/nav_walls"
            Android:icon="@drawable/ic_menu_gallery"
            Android:title="Walls" />

        <item
            Android:id="@+id/nav_wall_news"
            Android:title="News"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_wall_events"
            Android:title="Events"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_wall_fun"
            Android:title="Fun"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_wall_hadith"
            Android:title="Hadith"
            Android:visible="false" />
        <item
            Android:id="@+id/nav_wall_Poetry"
            Android:title="Poetry"
            Android:visible="false" />


    </group>

    <item
        Android:id="@+id/nav_com"
        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>
9
arslan

メニューレイアウトファイル:

<item
        Android:title="Setup"
        Android:id="@+id/SetupGr"
        Android:icon="@drawable/setup"
        />
<group
    Android:checkableBehavior="none"
    Android:id="@+id/SetupGroup">
    <item
        Android:id="@+id/setupOutdoor"
        Android:icon="@drawable/outdoor"
        Android:title="Outdoor" />
    <item
        Android:id="@+id/setupClocks"
        Android:icon="@drawable/ic_launcher"
        Android:title="Clocks" />
    <item
        Android:id="@+id/selectMaps"
        Android:icon="@drawable/map"
        Android:title="Select map" />
</group>

MyActivity.Javaで、目的のメニューをロードします。

public void LoadNavMenu(int iMenu){
    navigationView.getMenu().clear();
    navigationView.inflateMenu(iMenu);
    navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
    navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
}

OnNavigationItemSelected:

public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();
    navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
    navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
    switch (item.getItemId()){
        case R.id.HelpGr:
            navigationView.getMenu().setGroupVisible(R.id.HelpGroup,true);
            navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
            return true;
        case R.id.SetupGr:
            navigationView.getMenu().setGroupVisible(R.id.SetupGroup,true);
            navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
            return true;
    }    
    base.closeDrawer(GravityCompat.START);
    return true;
}

私は1つのアイテムを持っています-セットアップ-そしてユーザーがそれを選択すると-私はIDでグループを設定します-SetupGroup-表示され、引き出しを閉じずに戻ります。それ以外-すべてのグループを非表示に設定します。

1
Stoyan Mihaylov