From 8f5bfa58812aba06c03d5ff8b1bdd7db7fdc865e Mon Sep 17 00:00:00 2001 From: Aurimas Liutikas Date: Fri, 9 Dec 2016 02:22:34 +0000 Subject: [PATCH] Fix BottomNavigationMenu item selection via Menu object am: 69557a3a03 Change-Id: Iaab10e75354d53096958671d18bd47dc07dfdb28 GitOrigin-RevId=b4da44d7478295076c41ad68ffbced62f0e3b8d4 PiperOrigin-RevId: 141509777 --- .../internal/BottomNavigationItemView.java | 6 ++--- .../design/internal/BottomNavigationMenu.java | 13 +++++++--- .../internal/BottomNavigationMenuView.java | 8 +++---- .../widget/BottomNavigationViewTest.java | 24 ++++++++++++++++++- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/lib/src/android/support/design/internal/BottomNavigationItemView.java b/lib/src/android/support/design/internal/BottomNavigationItemView.java index 05a9b898d..88784cb49 100644 --- a/lib/src/android/support/design/internal/BottomNavigationItemView.java +++ b/lib/src/android/support/design/internal/BottomNavigationItemView.java @@ -16,6 +16,8 @@ package android.support.design.internal; +import static android.support.annotation.RestrictTo.Scope.GROUP_ID; + import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; @@ -36,8 +38,6 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; -import static android.support.annotation.RestrictTo.Scope.GROUP_ID; - /** * @hide */ @@ -131,8 +131,6 @@ public class BottomNavigationItemView extends FrameLayout implements MenuView.It @Override public void setChecked(boolean checked) { - mItemData.setChecked(checked); - ViewCompat.setPivotX(mLargeLabel, mLargeLabel.getWidth() / 2); ViewCompat.setPivotY(mLargeLabel, mLargeLabel.getBaseline()); ViewCompat.setPivotX(mSmallLabel, mSmallLabel.getWidth() / 2); diff --git a/lib/src/android/support/design/internal/BottomNavigationMenu.java b/lib/src/android/support/design/internal/BottomNavigationMenu.java index 883209775..9862175b2 100644 --- a/lib/src/android/support/design/internal/BottomNavigationMenu.java +++ b/lib/src/android/support/design/internal/BottomNavigationMenu.java @@ -16,14 +16,15 @@ package android.support.design.internal; +import static android.support.annotation.RestrictTo.Scope.GROUP_ID; + import android.content.Context; import android.support.annotation.RestrictTo; import android.support.v7.view.menu.MenuBuilder; +import android.support.v7.view.menu.MenuItemImpl; import android.view.MenuItem; import android.view.SubMenu; -import static android.support.annotation.RestrictTo.Scope.GROUP_ID; - /** * @hide */ @@ -47,6 +48,12 @@ public final class BottomNavigationMenu extends MenuBuilder { "Maximum number of items supported by BottomNavigationView is " + MAX_ITEM_COUNT + ". Limit can be checked with BottomNavigationView#getMaxItemCount()"); } - return super.addInternal(group, id, categoryOrder, title); + stopDispatchingItemsChanged(); + final MenuItem item = super.addInternal(group, id, categoryOrder, title); + if (item instanceof MenuItemImpl) { + ((MenuItemImpl) item).setExclusiveCheckable(true); + } + startDispatchingItemsChanged(); + return item; } } diff --git a/lib/src/android/support/design/internal/BottomNavigationMenuView.java b/lib/src/android/support/design/internal/BottomNavigationMenuView.java index e6ae08fb0..ba43b5bf7 100644 --- a/lib/src/android/support/design/internal/BottomNavigationMenuView.java +++ b/lib/src/android/support/design/internal/BottomNavigationMenuView.java @@ -287,6 +287,9 @@ public class BottomNavigationMenuView extends ViewGroup implements MenuView { } for (int i = 0; i < menuSize; i++) { mPresenter.setUpdateSuspended(true); + if (mMenu.getItem(i).isChecked()) { + mActiveButton = i; + } mButtons[i].initialize((MenuItemImpl) mMenu.getItem(i), 0); mPresenter.setUpdateSuspended(false); } @@ -297,10 +300,7 @@ public class BottomNavigationMenuView extends ViewGroup implements MenuView { mAnimationHelper.beginDelayedTransition(this); - mPresenter.setUpdateSuspended(true); - mButtons[mActiveButton].setChecked(false); - mButtons[newButton].setChecked(true); - mPresenter.setUpdateSuspended(false); + mMenu.getItem(newButton).setChecked(true); mActiveButton = newButton; } diff --git a/lib/tests/src/android/support/design/widget/BottomNavigationViewTest.java b/lib/tests/src/android/support/design/widget/BottomNavigationViewTest.java index 9c1c6cac4..37a58a6ad 100644 --- a/lib/tests/src/android/support/design/widget/BottomNavigationViewTest.java +++ b/lib/tests/src/android/support/design/widget/BottomNavigationViewTest.java @@ -47,7 +47,6 @@ import android.support.test.filters.SmallTest; import android.support.v4.content.res.ResourcesCompat; import android.view.Menu; import android.view.MenuItem; -import android.view.ViewGroup; import org.junit.Before; import org.junit.Test; @@ -212,4 +211,27 @@ public class BottomNavigationViewTest onView(allOf(withId(R.id.icon), isDescendantOfA(withId(R.id.destination_people)))).check( matches(TestUtilsMatchers.drawable(blueFill, allowedComponentVariance))); } + + @UiThreadTest + @Test + @SmallTest + public void testItemChecking() throws Throwable { + final Menu menu = mBottomNavigation.getMenu(); + assertTrue(menu.getItem(0).isChecked()); + checkAndVerifyExclusiveItem(menu, R.id.destination_home); + checkAndVerifyExclusiveItem(menu, R.id.destination_profile); + checkAndVerifyExclusiveItem(menu, R.id.destination_people); + } + + private void checkAndVerifyExclusiveItem(final Menu menu, final int id) throws Throwable { + menu.findItem(id).setChecked(true); + for (int i = 0; i < menu.size(); i++) { + final MenuItem item = menu.getItem(i); + if (item.getItemId() == id) { + assertTrue(item.isChecked()); + } else { + assertFalse(item.isChecked()); + } + } + } }