ABOUT ME

dddd-

Today
-
Yesterday
-
Total
-
  • [BottomNavigationView] 안드로이드 BottomNavigationView 아이템 고정
    Android/개발 2018. 10. 28. 02:28

    안드로이드 BottomNavigationView 아이템 고정 (ShiftMode False)



    ↓↓↓





    앞에서는 BottomNavigationView의 기본적인 사용법을 알아봤습니다.

    BottomNavigationView 사용법 알아보기


    이번에는 앞에 글에서 말씀드렸듯이 위 이미지 처럼 BottomNavigationView들의 아이템들이 움직이는 것을 막는방법을 알아보도록 하겠습니다. BottomNavigationView의 아이템인 BottomNavigationItemView는 기본적으로 ShiftModetrue로 되어있습니다. 그래서 ShiftModefalse로 만들어주어야 아이템들이 가지런히 놓이게 되는데 생각보다 구글에서 쉽게 만들어놓지 않았더군요. 하지만 BottomNavigationHelper class를 하나 만들어 간편하게 사용할 수 있습니다!






    BottomNavigationHelper.java 파일 작성

    package com.imaec.forblog;

    import android.annotation.SuppressLint;
    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;

    class BottomNavigationHelper {

    @SuppressLint("RestrictedApi")
    static void disableShiftMode(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("BNVHelper", "Unable to get shift mode field", e);
    } catch (IllegalAccessException e) {
    Log.e("BNVHelper", "Unable to change value of shift mode", e);
    }
    }
    }


    - 소스에 대해 간단히 설명드리면 BottomNavigationView의 ItemView를 찾아서 해당 Item의 ShiftMode를 false 처리해주는 소스입니다. 자세히 알아보고 싶으신 분들은 BottomNavigationMenuViewBottomNavigationItemView[Ctrl + 마우스 왼쪽 버튼]을 눌러 알아보시면 될 것 같습니다!






    MainActivity.java 소스 추가

    BottomNavigationHelper.disableShiftMode(bottomNavigationView);

    소스 위치는 bottomNavigationView객체를 할당해주는 findViewById() 함수 밑에서 호출해줍니다.


    MainActivity.java 전체 소스

    package com.imaec.forblog;

    import android.support.annotation.NonNull;
    import android.support.design.widget.BottomNavigationView;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.MenuItem;

    public class MainActivity extends AppCompatActivity {

    // FrameLayout에 각 메뉴의 Fragment를 바꿔 줌
    private FragmentManager fragmentManager = getSupportFragmentManager();
    // 4개의 메뉴에 들어갈 Fragment들
    private Menu1Fragment menu1Fragment = new Menu1Fragment();
    private Menu2Fragment menu2Fragment = new Menu2Fragment();
    private Menu3Fragment menu3Fragment = new Menu3Fragment();
    private Menu4Fragment menu4Fragment = new Menu4Fragment();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation_view);
    // BottomNavigationView 메뉴를 선택할 때마다 위치가 변하지 않도록
    BottomNavigationHelper.disableShiftMode(bottomNavigationView);
    // 첫 화면 지정
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.frame_layout, menu1Fragment).commitAllowingStateLoss();

    // bottomNavigationView의 아이템이 선택될 때 호출될 리스너 등록
    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    switch (item.getItemId()) {
    case R.id.navigation_menu1: {
    transaction.replace(R.id.frame_layout, menu1Fragment).commitAllowingStateLoss();
    break;
    }
    case R.id.navigation_menu2: {
    transaction.replace(R.id.frame_layout, menu2Fragment).commitAllowingStateLoss();
    break;
    }
    case R.id.navigation_menu3: {
    transaction.replace(R.id.frame_layout, menu3Fragment).commitAllowingStateLoss();
    break;
    }
    case R.id.navigation_menu4: {
    transaction.replace(R.id.frame_layout, menu4Fragment).commitAllowingStateLoss();
    break;
    }
    }

    return true;
    }
    });
    }
    }





    결과


    - 이렇게 깔끔하게 정렬이 됐습니다!

    알면 쉽고 모르면 어려운 안드로이드 개발, 모두 경험치를 열심히 쌓아 고수가 됩시다!



    안드로이드 RecyclerView를 이용한 프로젝트 구경하기

    안드로이드 BottomNavigationView 기본 사용법



    * 궁금한점이 있으시면 댓글로 남겨주세요~ 최대한 빨리 답변드리도록 하겠습니다!




    댓글

Designed by Tistory.