web-dev-qa-db-fra.com

Menus dynamiques dans NavigationView

J'ai cette mise en page:

<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical">

    <!-- The ActionBar -->
    <include
        layout="@layout/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />

    <!-- The main content view -->
    <FrameLayout
        Android:id="@+id/flContent"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />
</LinearLayout>

<!-- The navigation drawer -->
<Android.support.design.widget.NavigationView
    Android:id="@+id/nvView"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:background="@Android:color/white"
    app:menu="@menu/drawer_menu"
    app:headerLayout="@layout/nav_header"/>

Donc, en regardant que dans NavigationView nous avons l'attribut:

  app:menu="@menu/drawer_menu"

Et j'ai ce dossier de menu d'ID XML.

Je veux créer des menus dynamiques, c'est-à-dire que dans le code, je devrais monter les objets 'MenuItem' et les placer dans NavigationView.

Est-ce correct? Est-ce la meilleure pratique? Est-ce possible?

Remarque: Mon code fonctionne avec 'static tiroir_menu', je veux l'améliorer.

J'attends.

[MODIFIER]

Je le fais:

 Menu menu = nvDrawer.getMenu();
        for (KSMenuItem kmi : menus.values()) {
            if (menu.size() == 0) {
                menu.add(kmi.getId());
            }
            if (menu.getItem(kmi.getId()) == null) {
                menu.add(kmi.getId());
            }
            MenuItem mi = menu.getItem(kmi.getId());
            mi.setIcon(kmi.getIcon());
            mi.setTitle(kmi.getTittle());
        }

Mais cette erreur s'est produite:

06-27 15: 26: 15.538 15335-15335 /? E/AndroidRuntime ﹕ FATAL EXCEPTION: main Process: com.example.sticdev30.newdrawer, PID: 15335 Java.lang.RuntimeException: impossible de démarrer l'activité ComponentInfo {com.example.sticdev30.newdrawer/com.example.sticdev30.newdrawer.MainActivity }: Android.content.res.Resources $ NotFoundException: ID de ressource de chaîne # 0x1

KSMenuItem est un POJO avec mes données de menu. Dans kmi.id, j'ai informé des entiers incrémentiels ...

J'attends

11
Dimmy Magalhães

On dirait que kmi.getId() renvoie int (ou long).

Mais Menu.add (int) ajoute un menu avec un titre à partir des ressources de chaîne données, qui est généralement représenté par R.string.something, Et non pour les valeurs entières habituelles.

Menu.add (CharSequence) ajoute un menu avec le titre de CharSequence, vous devez donc faire une conversion int-to-string comme menu.add(kmi.getId() + "");

1
WKBae

Vous pouvez regonfler NavigationViewà l'exécution avec 2 lignes de code en utilisant la méthode publique inflateMenu. Dans cet exemple, je regonfle avec new_navigation_drawer_items.xml

navigationView.getMenu().clear(); //clear old inflated items.
navigationView.inflateMenu(R.menu.new_navigation_drawer_items); //inflate new items.
34
Nam Trung

Vous pouvez ajouter des menus dynamiquement en procédant comme suit:

Étape 1. Obtenir l'objet de menu à partir de la vue de navigation NavigationView.getMenu ()

Étape 2. Ajoutez n'importe quel élément au menu en utilisant Menu.add ()

11
Neeraj Kumar

Nous pouvons ajouter/supprimer dynamiquement des éléments de menu. Supposons que nous ayons ces éléments de menu `

<group Android:checkableBehavior="single">
    <item
        Android:id="@+id/nav_home"
        Android:icon="@mipmap/home_icon_x48"
        Android:title="Home" />
    <item
        Android:id="@+id/nav_part_catalouge"
        Android:icon="@mipmap/catalogue_icon_x48"
        Android:title="Parts Catalogue" />
    <item
        Android:id="@+id/nav_favourite"
        Android:icon="@mipmap/my_favourate_x48"
        Android:title="My-Favourite" />\
    <item
        Android:id="@+id/nav_opencarrequest"
        Android:icon="@mipmap/cart_request"
        Android:title="Cart-Request" />

    <item
        Android:id="@+id/nav_setting"
        Android:icon="@mipmap/settings_x48"
        Android:title="Settings" />
</group>


<item Android:title="">
    <menu>
        <item
            Android:id="@+id/nav_logout"
            Android:icon="@mipmap/logout_icon_x48"
            Android:title="Logout" />
    </menu>
</item>

"

Dans l'activité, nous pouvons ajouter ou supprimer des menuitems en fonction de notre condition

protected void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);// your activity layout here
   NavigationView navigationView= (NavigationView) findViewById(R.id.nav_view); // navigation view which holds menu items
   navigationView.setNavigationItemSelectedListener(this);
   if(yourCondition){
          navigationView.getMenu().getItem(0).setVisible(false); //if you want to hide first item
          navigationView.getMenu().getItem(1).setVisible(true); // if you want to show second menu item should be visible
  }


}

J'espère que cela vous aidera.

2
IMRA