탐색 창에서 선택한 메뉴 항목의 색상 변경
새로운 Android 디자인 지원 라이브러리를 사용하여 내 애플리케이션에서 탐색 창을 구현하고 있습니다.
선택한 항목의 색상을 변경하는 방법을 모르겠어요!
다음은 메뉴의 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>
그리고 다음은 내부에 위치한 navigationview 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>
도와 주셔서 감사합니다!
[편집] 나는 이미 이것과 같은 해결책을 보았다 : 안드로이드 메뉴의 배경색을 바꾸십시오 .
꽤 해킹 인 것 같고 새로운 디자인 지원 라이브러리를 사용하면 더 깨끗한 것이 도입되었을 것이라고 생각했습니다.
Color State Resource를 사용하여이를 달성 할 수 있습니다 . NavigationView
당신이 사용하고 있다는 것을 알게되면
app:itemIconTint="@color/black"
app:itemTextColor="@color/primary_text"
여기에 대신 사용 @color/black
하거나 @color/primary_test
하는을 사용합니다 Color State List Resource
. 이를 위해 먼저 디렉토리 (디렉토리 xml
안에 color
있어야 함 ) 안에 새 (예 : drawer_item.xml) 를 만듭니다. 이미 res
이름이 지정된 디렉토리가 없으면 새로 color
만듭니다.
이제 내부에서 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
또는 프로그래밍 방식)으로 설정하면 특정 항목이 선택되지 않은 항목과 다른 색상을 갖게됩니다.
저는 믿습니다 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>
Make another drawable file nav_item_drawable.xml
with following contents:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/highlight_color" android:state_checked="true"/>
</selector>
Finally add app:itemBackground
tag in the 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">
here the highlight_color.xml file defines a solid color drawable for the background. Later this color drawable is assigned to nav_item_drawable.xml selector.
This worked for me. Hopefully this will help.
********************************************** UPDATED **********************************************
Though the above mentioned answer gives you fine control over some properties, but the way I am about to describe feels more SOLID and is a bit COOLER.
So what you can do is, you can define a ThemeOverlay in the styles.xml
for the NavigationView like this :
<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>
now apply this ThemeOverlay to app:theme
attribute of NavigationView, like this:
<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">
I hope this will help.
One need to set NavigateItem
checked true whenever item in NavigateView
is clicked
//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);
Add NavigationItemSelectedListener
on 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;
}
Here is the another way to achive this:
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);
}
}
Here's how you can do it in your Activity's onCreate method:
NavigationView navigationView = findViewById(R.id.nav_view);
ColorStateList csl = new ColorStateList(
new int[][] {
new int[] {-android.R.attr.state_checked}, // unchecked
new int[] { android.R.attr.state_checked} // checked
},
new int[] {
Color.BLACK,
Color.RED
}
);
navigationView.setItemTextColor(csl);
navigationView.setItemIconTintList(csl);
'developer tip' 카테고리의 다른 글
JQuery UI 자동 완성 도우미 텍스트를 제거 / 변경하는 방법은 무엇입니까? (0) | 2020.08.29 |
---|---|
Android에서 문자열 너비를 얻는 방법은 무엇입니까? (0) | 2020.08.29 |
두 CGRect 비교 (0) | 2020.08.29 |
Mac 키보드를 사용하여 iPhone 시뮬레이터에서 텍스트 필드를 입력 할 수 없습니까? (0) | 2020.08.29 |
하위보기가보기에 있는지 확인 (0) | 2020.08.29 |