114

新しい Android Design Support ライブラリを使用して、アプリケーションにナビゲーション ドロワーを実装しています。

選択したアイテムの色を変更する方法がわかりません!

メニューのxmlは次のとおりです。

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
    <item
        android:id="@+id/navigation_item_1"
        android:icon="@drawable/ic_1"
        android:title="@string/navigation_item_1"/>

    <item
        android:id="@+id/navigation_item_2"
        android:icon="@drawable/ic_2"
        android:title="@string/navigation_item_2"/>
</group>

そして、これは内部に配置されたナビゲーションビューxmlですandroid.support.v4.widget.DrawerLayout:

<android.support.design.widget.NavigationView
    android:id="@+id/activity_main_navigationview"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/drawer_header"
    app:itemIconTint="@color/black"
    app:itemTextColor="@color/primary_text"
    app:menu="@menu/menu_drawer">

    <TextView
        android:id="@+id/main_activity_version"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:layout_marginLeft="@dimen/activity_horizontal_margin"
        android:textColor="@color/primary_text" />

</android.support.design.widget.NavigationView>

ご協力ありがとうございました !

[編集] 私はすでに次のようなソリューションを見てきました: Android メニューの背景色を変更します。

かなりのハックのようで、新しいデザイン サポート ライブラリを使用すると、よりクリーンなものが導入されたのではないかと思いました。

4

7 に答える 7

266

Color State Resourceを使用してこれを実現できます。NavigationViewあなたが使用している内部に気づいたら

app:itemIconTint="@color/black"
app:itemTextColor="@color/primary_text"

@color/blackここでは、または@color/primary_testを使用する代わりに、 を使用しColor State List Resourceます。そのためには、最初にディレクトリ (ディレクトリ内にある必要があります) 内に新しいxml(例: drawer_item.xml) を作成します。まだ名前を付けたディレクトリがない場合は、作成します。colorrescolor

今、内部drawer_item.xmlでこのようなことをします

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="checked state color" android:state_checked="true" />
    <item android:color="your default color" />
</selector>

最後のステップはあなたを変えることですNavigationView

<android.support.design.widget.NavigationView
    android:id="@+id/activity_main_navigationview"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/drawer_header"
    app:itemIconTint="@color/drawer_item"  // notice here
    app:itemTextColor="@color/drawer_item" // and here
    app:itemBackground="@android:color/transparent"// and here for setting the background color to tranparent
    app:menu="@menu/menu_drawer">

IconTintこのように、 、ItemTextColor、に対して個別のカラー状態リスト リソースを使用できますItemBackground

アイテムをチェック済みとして設定すると (インxmlまたはプログラムで)、特定のアイテムはチェックされていないアイテムとは異なる色になります。

于 2015-06-26T13:13:04.220 に答える
78

私はapp:itemBackgroundドローアブルを期待していると信じています。以下の手順に従ってください。

highlight_color.xml次の内容のドローアブル ファイルを作成します。

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
     <solid android:color="YOUR HIGHLIGHT COLOR"/>
</shape>

nav_item_drawable.xml次の内容のドローアブル ファイルをもう 1 つ作成します。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/highlight_color" android:state_checked="true"/>
</selector>

最後にapp:itemBackgroundNavView にタグを追加します:

<android.support.design.widget.NavigationView
android:id="@+id/activity_main_navigationview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:itemIconTint="@color/black"
app:itemTextColor="@color/primary_text"
app:itemBackground="@drawable/nav_item_drawable"
app:menu="@menu/menu_drawer">

ここで、highlight_color.xml ファイルは、背景用の無地のドローアブルを定義します。後で、このカラー ドローアブルが nav_item_drawable.xml セレクターに割り当てられます。

これは私にとってはうまくいきました。うまくいけば、これは役に立ちます。

********************************************** 更新 *** ********************************************

上記の回答により、いくつかのプロパティを細かく制御できますが、これから説明する方法は、より堅実で少しCOOLERです。

したがって、次のように NavigationViewのThemeOverlayを定義できます。styles.xml

    <style name="ThemeOverlay.AppCompat.navTheme">

        <!-- Color of text and icon when SELECTED -->
        <item name="colorPrimary">@color/color_of_your_choice</item> 

        <!-- Background color when SELECTED -->
        <item name="colorControlHighlight">@color/color_of_your_choice</item> 

    </style>

次のように、この ThemeOverlay をapp:themeNavigationView の属性に適用します。

<android.support.design.widget.NavigationView
android:id="@+id/activity_main_navigationview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:theme="@style/ThemeOverlay.AppCompat.navTheme"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/menu_drawer">

これが役立つことを願っています。

于 2016-07-16T06:29:04.307 に答える
5

アイテムがクリックさNavigateItemれるたびに、checked trueを設定する必要がありますNavigateView

//listen for navigation events
NavigationView navigationView = (NavigationView)findViewById(R.id.navigation);
navigationView.setNavigationItemSelectedListener(this);
// select the correct nav menu item
navigationView.getMenu().findItem(mNavItemId).setChecked(true);

アドオンNavigationItemSelectedListener_NavigationView

  @Override
  public boolean onNavigationItemSelected(final MenuItem menuItem) {
    // update highlighted item in the navigation menu
    menuItem.setChecked(true);
    mNavItemId = menuItem.getItemId();

    // allow some time after closing the drawer before performing real navigation
    // so the user can see what is happening
    mDrawerLayout.closeDrawer(GravityCompat.START);
    mDrawerActionHandler.postDelayed(new Runnable() {
      @Override
      public void run() {
        navigate(menuItem.getItemId());
      }
    }, DRAWER_CLOSE_DELAY_MS);
    return true;
  }
于 2015-06-17T09:23:02.593 に答える
2

これを達成する別の方法は次のとおりです。

public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            item.setEnabled(true);
            item.setTitle(Html.fromHtml("<font color='#ff3824'>Settings</font>"));
            return false;
            }
        });


    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

}

于 2016-04-15T11:09:11.820 に答える