带有actionLayout的NavigationView菜单项。如何为每个项目设置这些操作布局的属性?

问题描述 投票:0回答:1

这个答案之后,我学习了如何通过添加

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
调用某种方法来访问其操作布局?

java android navigationview
1个回答
1
投票

好! @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)
);

此外,看起来我可以对添加到这些“动作布局”中的任何对象进行或多或少相同的操作。 :-)

© www.soinside.com 2019 - 2024. All rights reserved.