2016-12-05 2 views
21

Я создаю приложение, в котором у меня есть BottomNavigationView. Все работает нормально, пока я не дойду до Activity.Удаление анимации/смены режима из BottomNavigationView android

Навигационная это:

enter image description here

Проблема заключается в том, что она имеет эту анимацию по умолчанию, так что толкает активный элемент каждый раз выше, чем у остальных.

Другой пример:

enter image description here

Так что мой вопрос заключается в том, как избавиться от этой анимации по умолчанию, и каждый элемент выравнивается, когда я переключаться между ними?

Мой код:

public class MainActivity extends AppCompatActivity { 
    private BottomNavigationView bottomNavigationView; 
    private Fragment fragment; 
    private FragmentManager fragmentManager; 
    private FragmentTransaction transaction; 

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

    private void setupBottomBar() { 
     bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottomBar); 
     fragmentManager = getSupportFragmentManager(); 
     fragment = new CardDeckFragment(); 
     transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.activity_main, fragment).commit(); 
     bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
       switch (item.getItemId()){ 
        case R.id.action_card_deck:{ 
         Toast.makeText(MainActivity.this, "Card Deck Selected", Toast.LENGTH_SHORT).show(); 
         fragment = new CardDeckFragment(); 
         break; 
        } 
        case R.id.action_favorites:{ 
         Toast.makeText(MainActivity.this, "Favorites Selected", Toast.LENGTH_SHORT).show(); 
         fragment = new FavoritesFragment(); 
         break; 
        } 
        case R.id.action_favorites_another:{ 
         Toast.makeText(MainActivity.this, "Image Selected", Toast.LENGTH_SHORT).show(); 
         fragment = new ImageFragment(); 
         break; 
        } 
        case R.id.action_profile:{ 
         Toast.makeText(MainActivity.this, "Profile Selected", Toast.LENGTH_SHORT).show(); 
         fragment = new ProfileFragment(); 
         break; 
        } 
        case R.id.action_menu:{ 
         Toast.makeText(MainActivity.this, "Menu Selected", Toast.LENGTH_SHORT).show(); 
         fragment = new MenuFragment(); 
         break; 
        } 
       } 

       transaction = fragmentManager.beginTransaction(); 
       transaction.replace(R.id.activity_main, fragment).commit(); 
       return true; 
      } 
     }); 



    } 
} 

и мой макет:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.realtimegaming.androidnative.testproject.MainActivity"> 

    <android.support.design.widget.BottomNavigationView 
     android:id="@+id/bottomBar" 
     android:layout_alignParentBottom="true" 
     android:background="@color/brown" 
     android:layout_gravity="bottom" 
     android:gravity="bottom" 
     android:layout_marginTop="?attr/actionBarSize" 
     app:itemBackground="@color/colorPrimary" 
     app:menu="@menu/bottom_navigation_main" 
     app:itemIconTint="@color/white" 
     android:fitsSystemWindows="true" 
     android:animateLayoutChanges="false" 
     android:splitMotionEvents="false" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 
</RelativeLayout> 
+0

Вы пытались удалить * animateLayoutChanges * и * splitMotionEvents * свойства? –

+0

нет ... можете ли вы привести пример? –

+0

Проверьте мой ответ ниже. –

ответ

49

Ok я нашел способ в случае, если это помогает кто-то другой. Поэтому по умолчанию BottomNavigationView добавляет shiftingmode = true, когда его более 3 элементов.

В настоящий момент вы не можете изменить его через существующий API, и единственный способ отключить режим сдвига - использовать отражение.

Таким образом, мы можем используйте этот помощник, чтобы избавиться от этого:

class BottomNavigationViewHelper { 

    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"); 
     } 
    } 
} 

, а затем использовать его как это:

BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottomBar); 
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView); 

Надеется, что это помогает кто-то с той же проблемой, со мной !!!

Помните, что вам нужно будет выполнить этот метод каждый раз, когда вы меняете элементы меню в своем окне BottomNavigationView.

UPDATE

Согласно различным stackoverflow question, также необходимо обновить конфигурационный файл Proguard (например proguard-rules.pro), код выше использует отражение и не будет работать, если ProGuard запутать поле mShiftingMode.

-keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
} 
+0

Это помогло! И это также правильный ответ. Большое спасибо! – Muppet

+0

этот ответ помог .. Он не принимает анимацию полностью .. все еще может видеть небольшую анимацию, но лучше, чем поведение по умолчанию в библиотеке –

+37

Бог, разработка Android сумасшедшая ... –

Смежные вопросы