AndroidのWordゲームでは、現在、left_drawer_menu.xml
および3つのグループで構成される(私のターン、対戦相手のターン、最後に他のもの):
mLeftDrawer = (NavigationView) findViewById(R.id.left_drawer);
mLeftDrawer.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {
Menu menu = mLeftDrawer.getMenu();
if (menuItem.getGroupId() == R.id.my_move) {
menu.setGroupCheckable(R.id.my_move, true, true);
menu.setGroupCheckable(R.id.his_move, false, false);
menu.setGroupCheckable(R.id.extras, false, false);
} else if (menuItem.getGroupId() == R.id.his_move) {
menu.setGroupCheckable(R.id.my_move, false, false);
menu.setGroupCheckable(R.id.his_move, true, true);
menu.setGroupCheckable(R.id.extras, false, false);
} else if (menuItem.getGroupId() == R.id.extras) {
menu.setGroupCheckable(R.id.my_move, false, false);
menu.setGroupCheckable(R.id.his_move, false, false);
menu.setGroupCheckable(R.id.extras, true, true);
}
menuItem.setChecked(true);
mLeftItem = menuItem.getItemId();
mDrawerLayout.closeDrawer(mLeftDrawer);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (mLeftItem == R.id.start) {
startNewGame();
}
}
},DRAWER_CLOSE_DELAY);
return true;
}
});
今、私はそのメニューを動的に変更しようとしています。
すべてのゲームデータを含むSQLiteインスタンスがあり、IntentService
を使用してデータベースを読み書きします-その部分は正常に動作します。
私の現在の難易度は次のとおりです。次のコードでは、新しいアイテムがoutsideR.id.my_move
グループ:
if (mLeftItem == R.id.start) {
startNewGame();
Random r = new Random();
int i = r.nextInt(100);
menu.add(R.id.my_move, i, i, "Item " + i); // why is my_move ignored?
}
UPDATE:
さらなるテストとして、次のコードを使用して、偶数のアイテムと偶数のアイテムを2つの別個のグループに割り当ててみました。
Random r = new Random();
int i = r.nextInt(100);
int group = 1 + (i % 2); // can be 1 or 2
menu.add(group, i, i, "Item " + i);
ただし、結果は無秩序に見えます。
また、(おそらくすでに修正されていますか?) Issue 1763 を発見しました。メニューグループの代わりにサブメニューを使用する方が良いのではないかと思いますか?
チェック時 MenuItemImpl ソースコード
...
* @param group Item ordering grouping control. The item will be added after
* all other items whose order is <= this number, and before any
* that are larger than it. This can also be used to define
* groups of items for batch state changes. Normally use 0.
...
MenuItemImpl(MenuBuilder menu, int group, int id, int categoryOrder, int ordering,
CharSequence title, int showAsAction) {
したがって、xmlで順序を定義する必要があります(1つのグループ内のアイテムに同じ順序を与え、次の各グループで増分します)
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<group Android:id="@+id/my_move" Android:checkableBehavior="single">
<item
Android:orderInCategory="0"
Android:id="@+id/game1"
Android:icon="@drawable/ic_stars_black_24dp"
Android:title="Game #1" />
<item
Android:orderInCategory="0"
Android:id="@+id/game2"
Android:icon="@drawable/ic_stars_black_24dp"
Android:title="Game #2" />
</group>
<group Android:id="@+id/his_move" Android:checkableBehavior="single">
<item
Android:orderInCategory="1"
Android:id="@+id/game5"
Android:icon="@drawable/ic_clock_black_24dp"
Android:title="Game #5" />
<item
Android:orderInCategory="1"
Android:id="@+id/game6"
Android:icon="@drawable/ic_clock_black_24dp"
Android:title="Game #6" />
<item
Android:orderInCategory="1"
Android:id="@+id/game7"
Android:icon="@drawable/ic_clock_black_24dp"
Android:title="Game #7" />
</group>
.....
</menu>
コードにアイテムを追加するときに適切な注文値を指定します。したがって、最初のグループの最後にアイテムを追加する場合は、次のように追加します。
menu.add(R.id.my_move, Menu.NONE, 0, "Item1");
2番目のグループに追加する場合は、次のように追加します。
menu.add(R.id.his_move, Menu.NONE, 1, "Item2");
コードの問題は、xmlのすべてのアイテムにデフォルトのorderInCategory 0があるため、これらすべてのアイテムの後に新しいアイテムが追加されることです。
[〜#〜] update [〜#〜]
アイコンを追加するには、setIcon
に MenuItem
メソッドを使用します
menu.add(R.id.my_move, Menu.NONE, 0, "Item1").setIcon(R.drawable.ic_stars_black_24dp);
私はこのように解決しました:
メニューを設定します。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:title="my moves"
Android:id="@+id/submenu_1">
<menu>
<item
Android:id="@+id/my_dummy_item_1"
Android:icon="@drawable/ic_menu_camera"
Android:title="Import" />
<item
Android:id="@+id/my_dummy_item_2"
Android:icon="@drawable/ic_menu_gallery"
Android:title="Gallery" />
<item
Android:id="@+id/add_item"
Android:icon="@drawable/ic_menu_manage"
Android:title="Add Item" />
</menu>
</item>
<item Android:title="opponent's moves"
Android:id="@+id/submenu_2">
<menu>
<item
Android:id="@+id/opponent_dummy_item_1"
Android:icon="@drawable/ic_menu_camera"
Android:title="Import" />
<item
Android:id="@+id/opponent_dummy_item_2"
Android:icon="@drawable/ic_menu_gallery"
Android:title="Gallery" />
<item
Android:id="@+id/opponent_dummy_item_3"
Android:icon="@drawable/ic_menu_manage"
Android:title="Tools" />
</menu>
</item>
</menu>
onNavigationItemSelected()
で、オーダーID(orでfindItem()
)で展開するMenuItem
を取得します、それからSubMenu
を取得し、新しいアイテムを追加します:
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.add_item) {
Random r = new Random();
int i = r.nextInt(100);
MenuItem myMoveGroupItem = navigationView.getMenu().getItem(0);
// MenuItem myMoveGroupItem = navigationView.getMenu().findItem(R.id.submenu_1); -- it also works!
SubMenu subMenu = myMoveGroupItem.getSubMenu();
subMenu.add("Item "+i);
}
return true;
}
私はそれが役立つことを願っています
menu.add(R.id.my_move, i, i, "Item " + i);
また、i
として順序(3番目のパラメーター)を割り当てています。これがgroupIdをオーバーライドしていると推測しています。前述のようにNONE
として設定してみてください here
menu.add(R.id.my_move, i, NONE, "Item " + i);
Edit:たぶんこのようなもの
MenuItem lastItem = menu.findItem(R.id.<lastItemId>);
int lastOrder= lastItem.getOrder();
menu.add(R.id.my_move, i, lastOrder-5, "Item " + i);
Order
はカテゴリと順序の組み合わせであるため、これほど単純ではない場合があります。