2016-12-05 13 views
21

私はBottomNavigationViewを持っているアプリケーションをビルドしています。アクティビティに入るまで、すべてうまく動作します。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は3つ以上の項目がある場合にshiftingmode = trueを追加します。

現時点では、既存の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 1として、あなたはまた、(例えばproguard-rules.pro)、上記のコードはリフレクションを使用し、ProGuardのはmShiftingModeフィールドを難読化した場合には動作しませんProGuardの設定ファイルを更新する必要があります。

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

これは正解です。どうもありがとう! – Muppet

+0

この回答は役に立ちました..それは完全にアニメーションを取りません..まだ小さなアニメーションを見ることができますが、ライブラリのデフォルトの動作よりも良い –

+37

神、Androidの開発はクレイジーです... –

関連する問題