2017-08-02 12 views
0

アプリケーションが最初に起動すると、最後のmenuitemがクリックされたかのようにチェックされます。最初のメニュー項目を表示します。 Android Studioでは、エラー、警告、またはログが表示され、何かが間違っていることを示唆しています。BottomNavigationViewは最後のmenuitem(起動時)をチェックし続けますが、最初のmenuitemを表示します

アプリが実行されると、他のメニューアイテムをクリックすると正常に機能します。私はメニューアイテムのそれぞれをクリックすることができ、それに応じて適切なフラグメントが設定されます。ここで

MainActivity.java次のとおりです。ここで

public class MainActivity extends AppCompatActivity { 
    private static final String SELECTED_ITEM = "arg_selected_item"; 

    private BottomNavigationView mBottomNav; 
    private int mSelectedItem; 

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

     mBottomNav = (BottomNavigationView) findViewById(R.id.navigation); 
     mBottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
       selectFragment(item); 
       return true; 
      } 
     }); 

     MenuItem selectedItem; 
     if (savedInstanceState != null) { 
      mSelectedItem = savedInstanceState.getInt(SELECTED_ITEM, 0); 
      selectedItem = mBottomNav.getMenu().findItem(mSelectedItem); 
     } else { 
      selectedItem = mBottomNav.getMenu().getItem(0); 
     } 
     selectFragment(selectedItem); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putInt(SELECTED_ITEM, mSelectedItem); 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    /* This is never called on start up */ 
    public void onBackPressed() { 
     MenuItem homeItem = mBottomNav.getMenu().getItem(0); 
     if (mSelectedItem != homeItem.getItemId()) { 
      // select home item 
      selectFragment(homeItem); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    private void selectFragment(MenuItem item) { 
     Fragment frag = null; 

     // init corresponding fragment 
     switch (item.getItemId()) { 
      case R.id.menu_home: 
       frag = HomeFragment.newInstance(); 
       break; 
      case R.id.menu_archives: 
       frag = ArchivesFragment.newInstance(); 
       break; 
      case R.id.menu_inspirational: 
       frag = InspirationalFragment.newInstance(); 
       break; 
      case R.id.menu_search: 
       frag = SearchFragment.newInstance(); 
       break; 
     } 

     // update selected item 
     mSelectedItem = item.getItemId(); 

     // unchecked the other items. 
     //THIS LINE HERE 
     for (int i = 0; i < mBottomNav.getMenu().size(); i++) { 
      MenuItem menuItem = mBottomNav.getMenu().getItem(i); 
      menuItem.setChecked(menuItem.getItemId() == mSelectedItem); 
     } 

     updateToolbarText(item.getTitle()); 

     if (frag != null) { 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.add(R.id.container, frag, frag.getTag()); 
      ft.commit(); 
     } 
    } 

    private void updateToolbarText(CharSequence text) { 
     ActionBar actionBar = getSupportActionBar(); 
     if (actionBar != null) { 
      actionBar.setTitle(text); 
     } 
    } 

activity_main.xmlです:ここでは

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:design="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context="com.ourdailystrength.mobile.android.MainActivity"> 

    <FrameLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:background="#f1f1f1"> 

    </FrameLayout> 

    <android.support.design.widget.BottomNavigationView 
     android:id="@+id/navigation" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="start" 
     design:menu="@menu/bottom_nav_items" /> 
</LinearLayout> 

bottom_nav_items.xmlです:

:ここ

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item 
     android:id="@+id/menu_home" 
     android:title="@string/menu_home" 
     android:icon="@drawable/ic_home_black_48dp" 
     android:checked="true" <!-- Doesn't matter if this line is included or not --> 
     app:showAsAction="ifRoom"/> 

    <item 
     android:id="@+id/menu_archives" 
     android:title="@string/menu_archives" 
     android:icon="@drawable/ic_archive_black_48dp" 
     app:showAsAction="ifRoom"/> 

    <item 
     android:id="@+id/menu_search" 
     android:title="@string/menu_search" 
     android:icon="@drawable/ic_search_black_48dp" 
     app:showAsAction="ifRoom"/> 

    <item 
     android:id="@+id/menu_inspirational" 
     android:title="@string/menu_inspirational" 
     android:icon="@drawable/ic_photo_black_48dp" 
     app:showAsAction="ifRoom"/> 
</menu> 

アップ時に最初のブーツのスクリーンショットです

enter image description here

なぜ、最後のメニュー項目がチェックされ、最初のメニュー項目ではないのですか?

EDIT: ので、下記の答えから、私はこの変更を行ったし、それが動作します:上記のコードで

private void selectFragment(MenuItem item) { 
    Fragment frag = null; 

    // update selected item 
    mSelectedItem = item.getItemId(); 

    // unchecked the other items. 
    for (int i = 0; i < mBottomNav.getMenu().size(); i++) { 
     MenuItem menuItem = mBottomNav.getMenu().getItem(i); 
     menuItem.setChecked(false); 
    } 

    // init corresponding fragment 
    switch (mSelectedItem) { 
     case R.id.menu_home: 
      frag = HomeFragment.newInstance(); 
      mBottomNav.getMenu().findItem(R.id.menu_home).setChecked(true); 
      break; 
     case R.id.menu_archives: 
      frag = ArchivesFragment.newInstance(); 
      mBottomNav.getMenu().findItem(R.id.menu_archives).setChecked(true); 
      break; 
     case R.id.menu_inspirational: 
      frag = InspirationalFragment.newInstance(); 
      mBottomNav.getMenu().findItem(R.id.menu_inspirational).setChecked(true); 
      break; 
     case R.id.menu_search: 
      frag = SearchFragment.newInstance(); 
      mBottomNav.getMenu().findItem(R.id.menu_search).setChecked(true); 
      break; 
    } 

    updateToolbarText(item.getTitle()); 

    if (frag != null) { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.add(R.id.container, frag, frag.getTag()); 
     ft.commit(); 
    } 
} 

なぜでしょうTHIS LINE HEREを、それがこの奇妙なエラーを行うには原因?

答えて

0

これがあなたの問題を解決するのに役立つことを願っています。 Fragmentを変更するたびにこのメソッドを呼び出します。必要に応じてとunchecked colorを渡してください。

private void changeMenuItemCheckedStateColor(int checkedColor, int uncheckedColor) { 
     int[][] states = new int[][]{ 
       new int[]{-android.R.attr.state_checked}, // unchecked 
       new int[]{android.R.attr.state_checked}, // checked 
     }; 
     int[] colors = new int[]{ 
       uncheckedColor, 
       checkedColor 
     }; 
     ColorStateList colorStateList = new ColorStateList(states, colors); 
     bottomNavigationView.setItemTextColor(colorStateList); 
     bottomNavigationView.setItemIconTintList(colorStateList); 
    } 
0

あなたがいずれかを持っている場合は、それに役立つことを願ってプログラム

Menu bottomMenu; 
BottomNavigationView bottomNavigationMenu = (BottomNavigationView) findViewById(R.id.bottom_navigation); 
bottomMenu = navigation.getMenu(); 
bottomMenu.findItem(R.id.menu_home).setChecked(true); 

ことによってそれを実行してください2つのソリューション

1)グループ

<group android:checkableBehavior="single"> 
    <item .../> 
    <item .../> 
    <item .../> 
</group> 

2を使用します)がありますお問い合わせください。

+1

は、EDITを参照してください。なぜそのコードブロックが原因でしょうか? –

0

はコードの下に削除します。

// unchecked the other items. 
     for (int i = 0; i < mBottomNav.getMenu().size(); i++) { 
      MenuItem menuItem = mBottomNav.getMenu().getItem(i); 
      menuItem.setChecked(menuItem.getItemId() == mSelectedItem); 
     } 

とBottomNavigationViewに色合いの色を与える:

<android.support.design.widget.BottomNavigationView 
     android:id="@+id/navigation" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="start" 
     app:itemIconTint="@drawable/nav_item_color_state" 
     design:menu="@menu/bottom_nav_items" /> 
+0

EDITを参照してください。なぜそのコードブロックが原因でしょうか? –

関連する問題