在这个答案之后,我学习了如何通过添加
NavigationView
来向action layout
的菜单项添加额外的视图。我的问题本质上是,如何通过 Java 动态调整每个单独的 actionLayout
?
就我而言,我没有向菜单项添加“开关”,而是使用
actionLayout
添加一个额外的图标来显示该项目的状态。这是一个布尔状态,所以我想通过动态更改额外图标或切换可见性来显示差异。
所以我有一个像这样的
menu.xml
给我的NavigationView
:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:showIn="navigation_view">
<group android:id="@+id/menu_group"
android:checkableBehavior="single" >
<item
android:id="@+id/menu_item1"
android:icon="@drawable/some_main_icon"
app:actionLayout="@layout/myflag_actionlayout"
android:title="OPTION 1" />
<item
android:id="@+id/menu_item2"
android:icon="@drawable/some_main_icon"
app:actionLayout="@layout/myflag_actionlayout"
android:title="OPTION 2" />
<!-- etc. -->
</group>
</menu>
...以及我的
myflag_actionlayout.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:background="#444444"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<ImageView
android:id="@+id/lockedIcon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:srcCompat="@android:drawable/ic_lock_idle_lock" />
</LinearLayout>
所以看起来或多或少是这样的:
现在我想知道:如何获取每个菜单项的实例,从 Java 访问它们的
<ImageView>
实例,并根据布尔变量更改每个 lockedIcon
的 ImageView
? (例如,切换 ImageView
的可见属性或更改 app:srcCompat
属性的图像)我应该使用一些 findViewById(R.id.lockedIcon)
来完成此任务,还是这是一个坏主意,我应该以其他方式进行?
刚才我记得,我已经做了类似的事情,通过Java访问那些“
NavigationView
项目”,并在编辑标题的计数器中添加一个字符串:
NavigationView nav_v = findViewById(R.id.navigation_view);
MenuItem nav_option1 = nav_v.getMenu().findItem(R.id.menu_item1);
nav_option1.setTitle(getString(R.string.nav_option1_title) + " -> " + some_counter);
也许我可以从
nav_option1
调用某种方法来访问其操作布局?
好! @ianhanniballake 的建议方法非常有效。如果我这样做:
NavigationView nav_v = findViewById(R.id.navigation_view);
MenuItem nav_option1 = nav_v.getMenu().findItem(R.id.menu_item1);
ImageView option1_lock_icon = nav_option1.getActionView().findViewById(R.id.lockedIcon);
从那里,我可以用这个做任何我想做的事情
ImageView
:
// Toggle visibility approach
if (item_locked) {
option1_lock_icon.setVisibility(View.VISIBLE);
} else {
option1_lock_icon.setVisibility(View.INVISIBLE);
}
// Change icon approach
string uri = "";
if (item_locked) {
uri = "@android:drawable/ic_lock_idle_lock";
} else {
uri = "@android:drawable/ic_menu_view";
}
int imageResource = getResources()
.getIdentifier(uri,
null,
getPackageName()
);
option1_lock_icon.setImageDrawable(
getResources().getDrawable(imageResource)
);
此外,看起来我可以对添加到这些“动作布局”中的任何对象进行或多或少相同的操作。 :-)