簡體   English   中英

帶有 actionLayout 的 NavigationView 菜單項。 如何為每個項目設置這些動作布局的屬性?

[英]NavigationView menu items with actionLayout. How can I set those action layout's attribute for each item?

按照這個答案,我學習了如何通過添加action layout來向NavigationView的菜單項添加額外的視圖。 我的問題是,基本上,我如何通過 Java 動態地調整每個actionLayout

就我而言,我沒有向菜單項添加“開關”,而是使用actionLayout添加了一個額外的圖標,該圖標將顯示該項目的 state。 這是一個 boolean state,所以我想通過動態更改額外圖標或切換可見性來顯示差異。

所以,我的NavigationView有一個menu.xml像這個:

<?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>實例並根據 Z84E2C64F38F78BA3EA5C905ABZA 變量更改每個lockedIconImageView (例如,切換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)
);

此外,看起來我可以或多或少地對我添加到那些“動作布局”的任何 object 做同樣的事情。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM