Material Design Docs に示されているこのようなことを達成したいです。
colorControlHighlight
は、チェックされたアイテムの背景に使用されます。
カスタマイズする必要があります:
NavigationDrawer(NavigationView)には、チェック/選択された項目の構成のための3つのオプションがあります。
app:itemIconTint="@color/menu_text_color" //icon color
app:itemTextColor="@color/menu_text_color" //text color
app:itemBackground="@drawable/menu_background_color" //background
最初の2つのオプション(iconおよびtext)にはcolor state list resource- https://developer.Android.com/guide/topics/ resources/color-list-resource.html 。
このようなmenu_text_color
リソースはres/colorで作成する必要があります。このファイルの内容は次のようになります。
<!-- res/color/menu_text_color.xml -->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:color="@color/colorWhite" Android:state_checked="true" />
<item Android:color="@color/colorBlack" Android:state_checked="false"/>
</selector>
@color/colorWhite
-チェック項目に使用される色リソース
@color/colorBlack
-未チェックのアイテムに使用される色リソース
両方に対して1つのリソースを作成しましたが、テキスト用とアイコン用の2つの別々のファイルを作成することは可能です。
背景オプションには、色の代わりに描画可能なリソースが必要です。色を設定しようとするたびに例外が発生します。 Drawableリソースはres/drawableで作成する必要があり、そのコンテンツは次のようになります。
<!-- res/drawable/menu_background_color.xml -->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@Android:color/transparent" Android:state_checked="false"/>
<item Android:drawable="@color/colorPrimary" Android:state_checked="true"/>
</selector>
色をシミュレートするドロアブルを作成する必要はありません(私がそのような提案を見た他のソリューション-多分古いSDKバージョンの場合)、色はこのファイルで直接使用できます。このサンプルファイルでは、チェックされていない項目には透明色を使用し、チェックされた項目にはcolorPrimary
を使用しています。
コード例(動的メニュー項目追加):
menu.add(group_id, item_id, Menu.NONE, item_name).setCheckable(true).setChecked(false);
アイテムがチェック可能として設定されない場合、背景は機能しません(予想外のテキストとアイコンの色は期待どおりに機能します)。
itemBackground
、itemIconTint
、およびitemTextColor
は設定可能な単純なxml属性ですが、Android:
の代わりにカスタムプレフィックスを使用する必要があります。
<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">
<!-- Other layout views -->
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:fitsSystemWindows="true"
app:itemBackground="@drawable/my_ripple"
app:itemIconTint="#2196f3"
app:itemTextColor="#009688"
app:headerLayout="@layout/nav_header"
app:menu="@menu/drawer_view" />
</Android.support.v4.widget.DrawerLayout>
注:この場合、テキストの色、アイコンの色合い、および背景は静的です。テキストの色を変更したい場合(例:チェックを外したときはピンク、チェックしたときは青緑)、ColorStateList
を使用する必要があります。
/res/color
に新しい* .xmlファイルを作成します-それに名前を付けましょうstate_list.xml-次の内容で:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- This is used when the Navigation Item is checked -->
<item Android:color="#009688" Android:state_checked="true" />
<!-- This is the default text color -->
<item Android:color="#E91E63" />
</selector>
そして、次のように単純に参照します:app:itemTextColor="@color/state_list"
itemIconTint
についても同様です。 itemBackground
にはリソースIDが必要です。 docs も参照してください。
ColorControlHighlightを使用することは私にとって良い解決策です。最新のサポートライブラリを使用すると、すべてのウィジェットにテーマ(スタイルだけでなく)を定義できることに注意してください。たとえば、colorControlHighlightをNavigationViewテーマに定義できますが、これは他のウィジェットには適用されません。
イベントに基づいたアクティビティのメニュー項目の色を1つだけ変更する場合は、HANAIHASHEMIのこのブログを参照してください。
https://hanihashemi.com/2017/05/06/change-text-color-of-menuitem-in-navigation-drawer/
private void setTextColorForMenuItem(MenuItem menuItem, @ColorRes int color) {
SpannableString spanString = new SpannableString(menuItem.getTitle().toString());
spanString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(this, color)), 0, spanString.length(), 0);
menuItem.setTitle(spanString);
}
メソッドを呼び出す
setTextColorForMenuItem(item, R.color.colorPrimary);
Xamarin Androidを使用する場合は、これを試してください:
private void SetTextColorForMenuItem(IMenuItem menuItem, Android.Graphics.Color color)
{
SpannableString spanString = new SpannableString(menuItem.TitleFormatted.ToString());
spanString.SetSpan(new ForegroundColorSpan(color), 0, spanString.Length(), 0);
menuItem.SetTitle(spanString);
}
メソッドの呼び出し:
SetTextColorForMenuItem(navigationView.Menu.GetItem(0), Android.Graphics.Color.OrangeRed);
プログラムでこのコードを使用できます:
int[][] states = new int[][] {
new int[] { Android.R.attr.state_enabled}, // enabled
new int[] {-Android.R.attr.state_enabled}, // disabled
new int[] {-Android.R.attr.state_checked}, // unchecked
new int[] { Android.R.attr.state_pressed} // pressed
};
int[] colors = new int[] {
Color.BLACK,
Color.RED,
Color.GREEN,
Color.BLUE
};
ColorStateList myList = new ColorStateList(states, colors);
nav_view.setItemIconTintList(myList);
ナビゲーションビューでは、独自のアイテムビューを提供することもできます。新しいappcompat-v7:23.1.0
でできること
app:actionLayoutまたはMenuItemCompat.setActionView()を使用して、アイテムのカスタムビューを設定します。
View view = View.inflate(context, R.layout.your_custom_nav_layout_item, null);
MenuItemCompat.setActionView(menuItem, view);
このようにして、TextViewで独自のレイアウトを作成し、必要に応じてbackgrounds/colors/fonts
を変更できます。これが役に立てば幸いです:) ソース
次のステートメントを使用して実行できます。
navigationView.setItemBackground(ContextCompat.getDrawable(CustomerHomeActivity.this, R.color.transparent));