공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
기존에 있던 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));
정말 간단하죠?
이상입니다.
'안드로이드' 카테고리의 다른 글
안드로이드 리사이클러뷰 아이템 애니메이션 추가하기. RecyclerView item setAnimation (0) | 2020.04.08 |
---|---|
안드로이드 borderless button 만들기 (0) | 2020.04.07 |
안드로이드 MotionLayout 사용 시 AAPT: error: attribute target (aka thomas.park.altube:target) not found. (0) | 2020.03.19 |
안드로이드 유튜브 스타일 모션레이아웃(3) - 모션레이아웃 적용하기[1] (0) | 2020.03.18 |
안드로이드 유튜브 스타일 모션레이아웃(2) - 메인화면 구성 (0) | 2020.03.18 |