私はアプリに夜のテーマを追加しようとしていますが、ナビゲーションドロワーのテキストとアイコンを暗い背景と一緒に白くしようとして3時間近く無駄にしています。 MainActivity.Java
のonCreate()
でこれを実行しようとしている方法を次に示します。
navigationView = (NavigationView) findViewById(R.id.navigation_view);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
// This method will trigger onItemClick of navigation menu
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// Checking if the item is in checked state or not, if not make it in checked state
if (menuItem.isChecked())
menuItem.setChecked(false);
else menuItem.setChecked(true);
if (nightMode == 0) {
SpannableString spanString = new SpannableString(menuItem.getTitle().toString());
spanString.setSpan(new ForegroundColorSpan(Color.WHITE), 0, spanString.length(), 0); // fix the color to white
menuItem.setTitle(spanString);
}
nightMode
ブール値は機能するため、無関係です。夜間モードがオン(0)に設定されている場合、ナビゲーションドロワーで選択されているメニュー項目はすべて白に変わります。ただし、これは各アイテムが選択されたときにのみ発生し、明らかに不便です。これが私のdrawer_dark.xmlです:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<group
Android:checkableBehavior="single">
<item
Android:id="@+id/unitone"
Android:checked="true"
Android:icon="@drawable/one_white"
Android:title="Classical Period" />
<item
Android:id="@+id/unittwo"
Android:checked="false"
Android:icon="@drawable/two_white"
Android:title="Postclassical Period" />
<item
Android:id="@+id/unitthree"
Android:checked="false"
Android:icon="@drawable/three_white"
Android:title="Early Modern Era" />
<item
Android:id="@+id/unitfour"
Android:checked="false"
Android:icon="@drawable/four_white"
Android:title="Dawn of Industrial Age" />
<item
Android:id="@+id/unitfive"
Android:checked="false"
Android:icon="@drawable/five_white"
Android:title="Modern Era" />
</group>
</menu>
各アイテムの透明な背景に白いアイコンを使用していますが、ナビゲーションドロワーの黒い背景に黒で表示されます。テキストの色を変更するためのxmlソリューションを探してみましたが、なぜこれが見落とされたのかわからないので頭を掻いています。
誰かが私が達成しようとしているものを手に入れる動的なソリューションを提供できますか?すべての助けに感謝します、ありがとう!
編集:私はサードパーティのライブラリを使用していません、それはサポートライブラリで提供されるNavigationViewです。 XMLレイアウトは次のとおりです。
<Android.support.v4.widget.DrawerLayout
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"
Android:id="@+id/drawer"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:elevation="7dp"
tools:context=".MainActivity"
Android:fitsSystemWindows="true" >
<FrameLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<FrameLayout
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/ColorDark" />
<include layout="@layout/toolbar" />
</FrameLayout>
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:background="#000"
Android:layout_height="match_parent"
Android:layout_width="match_parent"
Android:layout_gravity="start"
app:headerLayout="@layout/header"
app:menu="@menu/drawer" />
</Android.support.v4.widget.DrawerLayout>
NavigationView
にはsetItemTextColor()
というメソッドがあります。 ColorStateList
を使用します。
// FOR NAVIGATION VIEW ITEM TEXT COLOR
int[][] state = new int[][] {
new int[] {-Android.R.attr.state_enabled}, // disabled
new int[] {Android.R.attr.state_enabled}, // enabled
new int[] {-Android.R.attr.state_checked}, // unchecked
new int[] { Android.R.attr.state_pressed} // pressed
};
int[] color = new int[] {
Color.WHITE,
Color.WHITE,
Color.WHITE,
Color.WHITE
};
ColorStateList csl = new ColorStateList(state, color);
// FOR NAVIGATION VIEW ITEM ICON COLOR
int[][] states = new int[][] {
new int[] {-Android.R.attr.state_enabled}, // disabled
new int[] {Android.R.attr.state_enabled}, // enabled
new int[] {-Android.R.attr.state_checked}, // unchecked
new int[] { Android.R.attr.state_pressed} // pressed
};
int[] colors = new int[] {
Color.WHITE,
Color.WHITE,
Color.WHITE,
Color.WHITE
};
ColorStateList csl2 = new ColorStateList(states, colors);
ここ はその答えを得た場所です。そして、NavigationViewを割り当てた直後:
if (nightMode == 0) {
navigationView.setItemTextColor(csl);
navigationView.setItemIconTintList(csl2);
}
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:background="#000"
Android:layout_height="match_parent"
Android:layout_width="match_parent"
Android:layout_gravity="start"
app:headerLayout="@layout/header"
app:itemTextColor="your color"
app:menu="@menu/drawer" />
NavigationView、ejでapp:itemIconTintを使用します。
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
app:itemTextColor="@color/customColor"
app:itemIconTint="@color/customColor"
Android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_home"
app:menu="@menu/activity_home_drawer" />
より多くのオプション:
「textColorSecondary」をオーバーライドしてグループのタイトルを変更することもできます
あなたのstyles.xmlで
<style name="AppTheme.NavigationView">
<item name="Android:textColorSecondary">#FFFFFF</item>
</style>
あなたのレイアウトで
<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:menu="@menu/activity_main_menu_drawer_drawer"
Android:theme="@style/AppTheme.NavigationView"
app:itemIconTint="@color/colorPrimary"
app:itemTextColor="@color/white"/>
app:itemTextColor = "#fff"をNavigationViewに追加します
<Android.support.design.widget.NavigationView
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
app:menu="@menu/slider_menu"
Android:background="@color/colorAccent"
app:itemTextColor="#fff"
Android:id="@+id/navigation_view"
Android:layout_gravity="start"/>
以下のコードを使用して、アプリのナビゲーションドロワーのテキストの色を変更しました。
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setItemTextColor(ColorStateList.valueOf(Color.WHITE));
これは私のために動作します。 customThemeの代わりに、テーマをスタイルに追加できます。このコードでは、フォントとテキストサイズも変更できます。
<style name="MyTheme.NavMenu" parent="CustomTheme">
<item name="Android:textSize">16sp</item>
<item name="Android:fontFamily">@font/ssp_semi_bold</item>
<item name="Android:textColorPrimary">@color/yourcolor</item>
</style>
これが私のナビゲーションビューです
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:fitsSystemWindows="true"
app:theme="@style/MyTheme.NavMenu"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer">
<include layout="@layout/layout_update_available"/>
</Android.support.design.widget.NavigationView>
Javaクラスでこれを試してください
yourNavigationView.setItemTextColor(new ColorStateList(
new int [] [] {
new int [] {Android.R.attr.state_pressed},
new int [] {Android.R.attr.state_focused},
new int [] {}
},
new int [] {
Color.rgb (255, 128, 192),
Color.rgb (100, 200, 192),
Color.WHITE
}
));
今後、ナビゲーションドロワーアクティビティ(アクティビティプロンプトウィンドウでStudioが提供)を使用してここに来た場合
答えは-
MainActivityのOnCreate()の前にこれを使用します
int[][] state = new int[][] {
new int[] {Android.R.attr.state_checked}, // checked
new int[] {-Android.R.attr.state_checked}
};
int[] color = new int[] {
Color.rgb(255,46,84),
(Color.BLACK)
};
ColorStateList csl = new ColorStateList(state, color);
int[][] state2 = new int[][] {
new int[] {Android.R.attr.state_checked}, // checked
new int[] {-Android.R.attr.state_checked}
};
int[] color2 = new int[] {
Color.rgb(255,46,84),
(Color.GRAY)
};
ColorStateList csl2 = new ColorStateList(state2, color2);
mainActivityのonNavigationItemSelected()でこれを使用します(Navigation Drawerアクティビティを使用する場合、この関数を記述する必要はありません。MainActivityに追加されます)。
NavigationView nav = (NavigationView) findViewById(R.id.nav_view);
nav.setItemTextColor(csl);
nav.setItemIconTintList(csl2);
nav.setItemBackgroundResource(R.color.white);
ヒント-onNavigationItemSelected()のIf else Conditionの前にこのコードを追加します
テーマをナビゲーションビューに追加するだけで実行できます。
<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"
Android:background="@color/colorPrimary"
Android:theme="@style/AppTheme.NavigationView"
app:headerLayout="@layout/nav_header_drawer"
app:menu="@menu/activity_drawer_drawer"/>
そして、style.xmlファイルに、このテーマを追加します
<style name="AppTheme.NavigationView" >
<item name="colorPrimary">@color/text_color_changed_onClick</item>
<item name="Android:textColorPrimary">@color/Your_default_text_color</item>
</style>
これは助けになるかもしれません
Activity_ "navigation activity name"に移動しますNavigationView内にこのコードを挿入します
app:itemTextColor="color of your choice"
ベーステーマから派生したカスタムテーマを定義することもできます。
<Android.support.design.widget.NavigationView
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:id="@+id/nav_view"
app:headerLayout="@layout/nav_view_header"
app:menu="@layout/nav_view_menu"
app:theme="@style/MyTheme.NavMenu" />
次に、styles.xmlファイルで:
<style name="MyTheme.NavMenu" parent="MyTheme.Base">
<item name="Android:textColorPrimary">@color/yourcolor</item>
</style>
カスタムテーマにさらに属性を適用することもできます。
<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/drawer_item_bg"
app:headerLayout="@layout/nav_header_home"
app:menu="@menu/app_home_drawer" />
App:itemBackgroundを使用してアイテムの背景を設定するには
drawer_item_bg.xml
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape Android:shape="rectangle" >
<solid Android:color="@Android:color/transparent" />
</shape>
</item>
<item Android:top="-2dp" Android:right="-2dp" Android:left="-2dp">
<shape>
<padding Android:bottom="0dp" Android:left="15dp" Android:right="0dp" Android:top="0dp"/>
<solid Android:color="@Android:color/transparent" />
<stroke
Android:width="0.5dp"
Android:color="#CACACA" />
</shape>
</item>
</layer-list>
itemIconTint、アイコンの色を変更したい場合
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:itemTextColor="@color/colorPrimary"
app:itemIconTint="@color/colorPrimary"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />