gpt4 book ai didi

android - 如何在 NavigationView 中将项目添加到菜单组

转载 作者:IT老高 更新时间:2023-10-28 21:58:28 25 4
gpt4 key购买 nike

在 Android 的文字游戏中,我目前有一个从 left_drawer_menu.xml 膨胀的硬编码菜单,由 3 组组成(轮到我,轮到对手,最后是其他东西):

app screenshot

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 来读取/写入数据库 - 这部分工作正常。

我目前的困难是:使用以下代码,将新项目添加到外部 R.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?
}

app screenshot

更新:

作为进一步的测试,我尝试使用此代码将偶数和偶数项分配给 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);

但是结果看起来很困惑:

app screenshot

我还发现了(可能已经修复了?)Issue 176300并想知道是否应该更好地使用子菜单而不是菜单组?

最佳答案

在检查 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 中定义排序(给一组中的项目相同的顺序,并在每个后续组中递增)

<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");

如果要添加到第二组,请将其添加为:

menu.add(R.id.his_move, Menu.NONE, 1, "Item2");

您的代码的问题可能是 xml 中的所有项目都具有默认 orderInCategory 0,因此在添加新项目之后所有这些项目。

更新

要添加图标,请使用 setIcon MenuItem

的方法
menu.add(R.id.my_move, Menu.NONE, 0, "Item1").setIcon(R.drawable.ic_stars_black_24dp);

关于android - 如何在 NavigationView 中将项目添加到菜单组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34482404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com