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
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() + "");
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.
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 ()
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.