36

BottomNavigationView新しいサポート ライブラリ 25.0.0 から利用できるものを実装しました。これがそのための私のコードです

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    app:itemBackground="@color/colorPrimary"
    app:itemIconTint="@drawable/text"
    app:itemTextColor="@drawable/text"
    app:menu="@menu/bottom_navigation_main" />

そしてtext.xml描画可能

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/white" android:state_enabled="true" />
    <item android:color="@color/colorPrimaryDark" android:state_enabled="false" />
</selector>

このコードを使用すると、メニュー項目がクリックされたときにテキストの色を変更できますが、同じことを適用するとapp:itemBackgroundエラーが表示されます<item> tag requires a 'drawable' attribute or child tag defining a drawable

これは私が試したものですapp:itemBackground

app:itemBackground="@drawable/text"

私の質問は、選択したメニュー項目の背景色を変更するにはどうすればよいですか?

4

5 に答える 5

44

このミディアムポストから答えを見つけました

  1. android:state_checked代わりに使用する必要がありますandroid:state_enabled
  2. の代わりにonNavigationItemSelected使用する必要があります。return truereturn false

背景を設定するには、 android:colorin<item>では使用できません。使用する必要がありますandroid:drawable

したがって、ここでは、設定時にxmlファイルがどのように見えるかを示しapp:itemTextColorますapp:itemIconTint

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorPrimaryDark" android:state_checked="true" />
    <item android:color="@android:color/white" android:state_checked="false" />
</selector>

そしてapp:itemBackgroundセレクターを設定する

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/banner_white" android:state_checked="true"/>
    <item android:drawable="@drawable/banner_green" android:state_checked="false"/>
</selector>

ここbanner_whitebanner_greenは png です。

于 2017-01-02T05:49:30.227 に答える
21

OPと同様の問題に遭遇しましたが、少し異なります。sth like@color/color_selectorを BottomNavigationView のapp:itemBackground="___". ビューがデザイン パネルで非表示になり、起動時にアプリがクラッシュします。のような一定の色に設定するとうまくいきますが@color/black

より詳細な説明については、android api リファレンスを掘り下げました。これで、この問題を合理的に解決できる答えを見つけたと思います。(正確ではないかもしれません。)

問題は、あなたが提供するものが彼らが求めたものと正確ではないということです.

app:itemIconTint文字通りDrawableapp:itemTextColorを要求しながら、16進数の色を要求します。書き込む要素はColorDrawableです。これはDrawableから派生しているため、3 つの属性すべてにフィードできます。app:itemBackground<color>colors.xml

ただし、セレクターを使用するように変更すると、状況が異なります。hex color と drawable の両方に対応するセレクターがあります。セレクターは、入力したリソースのように機能しますが、結果は元のものではありません。これは、単一目的のラッパーに似ています。Drawableを必要とする属性に 16 進数の色を与えることはできません。

色セレクターは実際にはColorStateListであり、16 進数の色を提供し、res/color. android:colorこのファイルでは属性のみを使用できます。と書くとエラーになりますandroid:drawable
ドローアブル セレクタはStateListDrawableであり、Drawable を提供し、res/drawable. ここに書くべきですが、 と書いandroid:drawableてもエラーにはなりませんandroid:color

ただし、 Drawableandroid:colorとして認識できない16進数の色のみを提供しますが、 Drawableが必要なため、アプリは運命にあります。(直接原因)app:itemBackground

両方の属性 (android:colorおよびandroid:drawable) はColorDrawableを受け入れます。ここでは、一定の色を設定する場合と同じように機能します。

解決策(および実践)は次のとおりです。

  • で使用 (およびのみ)android:drawableres/drawable/drawable_selector.xmlます。例:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@color/colorAccent" android:state_checked="true" />
        <item android:drawable="@color/colorAccentDark" />
    </selector>
    
  • res/color/color_selector.xml16 進数の色が必要な場合に使用します (混乱を避けるため)。例:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:color="@android:color/white" android:state_checked="true"/>
        <item android:color="@color/colorPrimary" />
    </selector>
    
  • app:itemBackgroundドローアブルを提供します。例:

    <android.support.design.widget.BottomNavigationView
        ...
        app:itemBackground="@drawable/drawable_selector"
        app:itemIconTint="@color/color_selector"
        app:itemTextColor="@color/color_selector"
        ... />
    

android:color(Android Studio を使用している場合、オートコンプリート機能により、有効で使用可能な属性が通知され、 の下のセレクターで提案されないことに注意してくださいres/drawable。)

于 2017-05-29T13:01:10.927 に答える
2

ナビゲーション項目選択リスナーのサンプルコードです。それがあなたを助けることを願っています。

 @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;
  }

代替ソリューション:

次の内容で描画可能なファイル 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 を作成します。

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

最後に、 app:itemBackground タグを NavView に追加します。

<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 セレクターに割り当てられます。

これを試してみてください。

于 2017-01-02T06:00:38.900 に答える
1

簡単な方法が私のために働いた:

<BottomNavigationView
...
android:theme="@style/CustomTheme"/>
<style name="CustomTheme">
   <item name="android:background">@color/colorPrimary</item>
</style>
于 2020-11-09T07:58:59.490 に答える