私はこのレイアウトを持っています:
<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"/>
したがって、NavigationView
には次の属性があることがわかります。
app:menu="@menu/drawer_menu"
そして、私はこのXML idメニューフォルダーを持っています。
動的なメニューを作成したいのですが、コードでは「MenuItem」オブジェクトをマウントしてNavigationView
に設定する必要があります。
これは正しいです?これは最高の練習ですか?これは可能ですか?
注:私のコードは「静的ドロワーメニュー」で動作しています。改善したいと思います。
私は待っています。
[編集]
私はそれを作ります:
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());
}
しかし、このエラーが発生しました:
06-27 15:26:15.538 15335-15335 /? E/AndroidRuntime:致命的な例外:メインプロセス:com.example.sticdev30.newdrawer、PID:15335 Java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {com.example.sticdev30.newdrawer/com.example.sticdev30.newdrawer.MainActivity }:Android.content.res.Resources $ NotFoundException:文字列リソースID#0x1
KSMenuItemは、メニューデータを含むPOJOです。 kmi.idで、増分整数を通知しました...
私は待っています
kmi.getId()
はint
(またはlong
)を返します。
ただし、 Menu.add(int) は、通常の整数値ではなく、通常_R.string.something
_として表される、指定された文字列リソースからタイトル付きのメニューを追加します。
Menu.add(CharSequence) CharSequenceというタイトルのメニューを追加するため、menu.add(kmi.getId() + "");
のようなintから文字列への変換を行う必要があります
パブリックメソッドNavigationView
を使用して、2行のコードでinflateMenu
を実行時に再膨張できます。この例では、new_navigation_drawer_items.xml
navigationView.getMenu().clear(); //clear old inflated items.
navigationView.inflateMenu(R.menu.new_navigation_drawer_items); //inflate new items.
次の手順でメニューを動的に追加できます。
ステップ1。ナビゲーションビューからメニューオブジェクトを取得 NavigationView.getMenu()
ステップ2。 Menu.add() を使用してメニューにアイテムを追加します
メニュー項目を動的に追加/削除できます。このメニュー項目があると仮定します `
<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>
`
アクティビティでは、条件に基づいてメニュー項目を追加または削除できます
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
}
}
それがお役に立てば幸いです。