新しいサポートライブラリ25.0.0から利用可能なBottomNavigationView
を実装しました。ここに私のコードがあります
<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"
だから私の質問は、選択したメニュー項目の背景色をどのように変更できますか?
これから答えを見つけました 中程度の投稿
Android:state_checked
の代わりにAndroid:state_enabled
を使用する必要がありますonNavigationItemSelected
内では、return true
の代わりにreturn false
を使用する必要があります。背景を設定するには、Android:color
で<item>
を使用できません。Android:drawable
を使用する必要があります
app:itemTextColor
およびapp:itemIconTint
に設定しているときのXMLファイルの外観
<?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_white
とbanner_green
はpngです。
OPと同様の問題が発生しましたが、少し異なります。 sth like@color/color_selector
をBottomNavigationViewのapp:itemBackground="___"
に配置した場合。これにより、ビューがデザインパネルで非表示になり、起動時にアプリがクラッシュします。ただし、@color/black
のような一定の色に設定するだけで問題ありません。
より詳細な説明については、Android api reference。を参照しました。この問題を合理的に解決できる答えを見つけたと思います。(正確ではないかもしれません。)
問題は、あなたが提供したものが彼らが求めたものと正確に一致しないことです。
app:itemIconTint
およびapp:itemTextColor
は16進数の色を要求し、app:itemBackground
は文字通り Drawable を要求します。 <color>
に記述するcolors.xml
要素は、 ColorDrawable です。 Drawableから派生しているため、3つの属性すべてにフィードできます。
ただし、セレクタを使用するように変更すると、状況は異なります。 16進数の色とドロアブルの両方に対応するセレクターがあります。セレクターは、ユーザーが投入したリソースのように機能しますが、結果は元のものではありません。これは、単一目的のラッパーに似ています。 Drawableを必要とする属性に16進数の色を与えることはできません。
カラーセレクターは実際には ColorStateList であり、16進数の色を提供し、res/color
にあります。このファイルでは属性Android:color
のみを使用できます。 Android:drawable
と記述するとエラーが表示されます。
描画可能セレクターは StateListDrawable で、Drawableを提供し、res/drawable
にあります。ここにAndroid:drawable
と書く必要がありますが、Android:color
と書いてもエラーはありません。
ただし、Android:color
はDrawableとして認識できない16進色のみを提供し、app:itemBackground
はDrawableを必要とします、アプリは運命づけられています。 (直接の原因)
両方の属性(Android:color
およびAndroid:drawable
)はColorDrawableを受け入れます。ここでは、一定の色を設定する場合と同じように機能します。
解決策(および実践)は次のとおりです。
Android:drawable
でres/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>
(混乱を避けるため)16進数の色が必要な場合はres/color/color_selector.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_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 Studioを使用している場合、その自動補完機能はどの属性が有効で利用可能かを教えてくれます。セレクターでAndroid:color
を推奨しません。 res/drawable
!の下)
これを試してみてください、これはナビゲーション項目選択リスナーのサンプルコードです。お役に立てば幸いです。
@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>
最後に、NavViewにapp:itemBackgroundタグを追加します。
<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セレクターに割り当てられます。
これを試してください。
最初にxml bottom_navigation_itemsを作成します。
`<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="?android:colorControlHighlight">
<item>
<selector>
<item
Android:drawable="@color/primary_bottom_select"
Android:state_checked="true" />
<item
Android:drawable="@color/bottom_navigation"
Android:state_checked="false" />
</selector>
</item>
</ripple>`
2番目:app:itemBackground="@drawable/bottom_navigation_items"
を追加します