본문 바로가기
MOBILE/Android

안드로이드 Buttom bar 애니메이션 (Shifting) 제거하기

by 지구 2018. 8. 2.

android 에서 하단네비게이션바 (ButtomNavigationBar) 애니메이션 (Shifting) 제거하는 방법.


찾아보니 하단 바의 아이콘이 3개 이상일 때 API 에서 적용되는거라 API 자체에선 불가하고,

따로 Helper Class 를 만들어 관리해줘야 한다고 한다.

참고 : https://stackoverflow.com/questions/40176244/how-to-disable-bottomnavigationview-shift-mode




1. ButtomNavigationViewHelper 클래스 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.nadri.common;
 
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.util.Log;
import java.lang.reflect.Field;
 
/* Buttom bar 의 menu 가 3개 이상일 시 실행되는 애니메이션(Shifting) 방지 */
public class BottomNavigationViewHelper {
    public static void removeShiftMode(BottomNavigationView view) {
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
        try {
            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(menuView, false);
            shiftingMode.setAccessible(false);
            for (int i = 0; i < menuView.getChildCount(); i++) {
                BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
                item.setShiftingMode(false);
                // set once again checked value, so view will be updated
                item.setChecked(item.getItemData().isChecked());
            }
        } catch (NoSuchFieldException e) {
            Log.e("ERROR NO SUCH FIELD""Unable to get shift mode field");
        } catch (IllegalAccessException e) {
            Log.e("ERROR ILLEGAL ALG""Unable to change value of shift mode");
        }
    }
}
 
cs


2. Activity 의 onCreate() 메소드에서 선언

1
2
3
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bbar);
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);
BottomNavigationView bbar = (BottomNavigationView)findViewById(R.id.bbar);
cs


반응형

댓글