안드로이드

안드로이드 material.bottomnavigation.BottomNavigationView selected item icon & title text color 변경하기

알통몬_ 2020. 4. 1. 16:10
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


기존에 있던 Widget.BottomNavigationView 가 아닌

머터리얼에서 제공하는 

com.google.android.material.bottomnavigation.BottomNavigationView

의 선택된 item의 icon과 text 색상을 변경하는 코드입니다.

제가 다 해본 건 아니지만, xml에서는 default color만 변경이 가능합니다.

선택됐을 때 변경하려면 아래와 같이 하면 됩니다.


#1. selector.xml 생성하기

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

이렇게 checked or unchecked 상태의 색상을 지정합니다.

보통은 아이콘과 텍스트 색상을 통일하겠죠? 통일시키지 않을 경우

selector_icon.xml

selector_text.xml 처럼

2개의 파일을 만드시면 됩니다.


#2. BottomNavigationView클래스 열어보기

BottomNavigationView 클래스를 열어 코드를 확인해보면

public BottomNavigationView(
@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(createThemedContext(context, attrs, defStyleAttr, DEF_STYLE_RES), attrs, defStyleAttr);
// Ensure we are using the correctly themed context rather than the context that was passed in.
context = getContext();

// Create the menu
this.menu = new BottomNavigationMenu(context);

menuView = new BottomNavigationMenuView(context);
FrameLayout.LayoutParams params =
new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
menuView.setLayoutParams(params);

menuView는  BottomNavigationMenuView 클래스에서 

설정하면 될 것? 같다는 느낌이 오죠?

BottomNavigationMenuView 클래스를 열어보니

@RestrictTo(LIBRARY_GROUP)
public class BottomNavigationMenuView extends ViewGroup implements MenuView {
.....
private ColorStateList itemIconTint;
private ColorStateList itemTextColorFromUser;
.....

마침 itemIconTint, itemTextColorFromUser; 필드가 보이네요.

private이니 외부에서 사용할 수 없고 set 하는 메소드가 존재하는지 찾아봅니다.

public void setIconTintList(ColorStateList tint) {
itemIconTint = tint;
if (buttons != null) {
for (BottomNavigationItemView item : buttons) {
item.setIconTintList(tint);
}
}
}
public void setItemTextColor(ColorStateList color) {
itemTextColorFromUser = color;
if (buttons != null) {
for (BottomNavigationItemView item : buttons) {
item.setTextColor(color);
}
}
}

각각 메소드가 존재하네요.

둘다 매개변수가 ColorStateList입니다.  

'#1.' 에서 만든 selector.xml을사용하면 되겠습니다.


#3. 실제로 적용하기

binding.bottomNav.setItemTextColor(getResources().getColorStateList(R.drawable.bottom_navigation_colors));
binding.bottomNav.setItemIconTintList(getResources().getColorStateList(R.drawable.bottom_navigation_colors));

정말 간단하죠?

이상입니다.

반응형