Merge "Improvements to TextInputLayout" into lmp-mr1-ub-dev
diff --git a/design/api/current.txt b/design/api/current.txt
index e0e49ea..4e71e40 100644
--- a/design/api/current.txt
+++ b/design/api/current.txt
@@ -197,6 +197,7 @@
method public void setItemIconTintList(android.content.res.ColorStateList);
method public void setItemTextColor(android.content.res.ColorStateList);
method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
+ method public void setCheckedItem(int);
}
public static abstract interface NavigationView.OnNavigationItemSelectedListener {
diff --git a/design/src/android/support/design/internal/NavigationMenuPresenter.java b/design/src/android/support/design/internal/NavigationMenuPresenter.java
index b89c603..390c9e4 100644
--- a/design/src/android/support/design/internal/NavigationMenuPresenter.java
+++ b/design/src/android/support/design/internal/NavigationMenuPresenter.java
@@ -184,10 +184,21 @@
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int positionInAdapter = position - mMenuView.getHeaderViewsCount();
if (positionInAdapter >= 0) {
- mMenu.performItemAction(mAdapter.getItem(positionInAdapter).getMenuItem(), this, 0);
+ setUpdateSuspended(true);
+ MenuItemImpl item = mAdapter.getItem(positionInAdapter).getMenuItem();
+ if (item != null && item.isCheckable()) {
+ setCheckedItem(item);
+ }
+ mMenu.performItemAction(item, this, 0);
+ setUpdateSuspended(false);
+ updateMenuView(false);
}
}
+ public void setCheckedItem(MenuItemImpl item) {
+ mAdapter.setCheckedItem(item);
+ }
+
public View inflateHeaderView(@LayoutRes int res) {
View view = mLayoutInflater.inflate(res, mHeader, false);
addHeaderView(view);
@@ -241,13 +252,14 @@
private class NavigationMenuAdapter extends BaseAdapter {
- private static final String STATE_CHECKED_ITEMS = "android:menu:checked";
+ private static final String STATE_CHECKED_ITEM = "android:menu:checked";
private static final int VIEW_TYPE_NORMAL = 0;
private static final int VIEW_TYPE_SUBHEADER = 1;
private static final int VIEW_TYPE_SEPARATOR = 2;
private final ArrayList<NavigationMenuItem> mItems = new ArrayList<>();
+ private MenuItemImpl mCheckedItem;
private ColorDrawable mTransparentIcon;
private boolean mUpdateSuspended;
@@ -353,6 +365,12 @@
boolean currentGroupHasIcon = false;
for (int i = 0, totalSize = mMenu.getVisibleItems().size(); i < totalSize; i++) {
MenuItemImpl item = mMenu.getVisibleItems().get(i);
+ if (item.isChecked()) {
+ setCheckedItem(item);
+ }
+ if (item.isCheckable()) {
+ item.setExclusiveCheckable(false);
+ }
if (item.hasSubMenu()) {
SubMenu subMenu = item.getSubMenu();
if (subMenu.hasVisibleItems()) {
@@ -363,12 +381,18 @@
boolean subMenuHasIcon = false;
int subMenuStart = mItems.size();
for (int j = 0, size = subMenu.size(); j < size; j++) {
- MenuItem subMenuItem = subMenu.getItem(j);
+ MenuItemImpl subMenuItem = (MenuItemImpl) subMenu.getItem(j);
if (subMenuItem.isVisible()) {
if (!subMenuHasIcon && subMenuItem.getIcon() != null) {
subMenuHasIcon = true;
}
- mItems.add(NavigationMenuItem.of((MenuItemImpl) subMenuItem));
+ if (subMenuItem.isCheckable()) {
+ subMenuItem.setExclusiveCheckable(false);
+ }
+ if (item.isChecked()) {
+ setCheckedItem(item);
+ }
+ mItems.add(NavigationMenuItem.of(subMenuItem));
}
}
if (subMenuHasIcon) {
@@ -410,27 +434,32 @@
}
}
+ public void setCheckedItem(MenuItemImpl checkedItem) {
+ if (mCheckedItem == checkedItem || !checkedItem.isCheckable()) {
+ return;
+ }
+ if (mCheckedItem != null) {
+ mCheckedItem.setChecked(false);
+ }
+ mCheckedItem = checkedItem;
+ checkedItem.setChecked(true);
+ }
+
public Bundle createInstanceState() {
Bundle state = new Bundle();
- ArrayList<Integer> checkedItems = new ArrayList<>();
- for (NavigationMenuItem item : mItems) {
- MenuItemImpl menuItem = item.getMenuItem();
- if (menuItem != null && menuItem.isChecked()) {
- checkedItems.add(menuItem.getItemId());
- }
- }
- state.putIntegerArrayList(STATE_CHECKED_ITEMS, checkedItems);
+ state.putInt(STATE_CHECKED_ITEM, mCheckedItem.getItemId());
return state;
}
public void restoreInstanceState(Bundle state) {
- ArrayList<Integer> checkedItems = state.getIntegerArrayList(STATE_CHECKED_ITEMS);
- if (checkedItems != null) {
+ int checkedItem = state.getInt(STATE_CHECKED_ITEM, 0);
+ if (checkedItem != 0) {
mUpdateSuspended = true;
for (NavigationMenuItem item : mItems) {
MenuItemImpl menuItem = item.getMenuItem();
- if (menuItem != null && checkedItems.contains(menuItem.getItemId())) {
- menuItem.setChecked(true);
+ if (menuItem != null && menuItem.getItemId() == checkedItem) {
+ setCheckedItem(menuItem);
+ break;
}
}
mUpdateSuspended = false;
diff --git a/design/src/android/support/design/widget/CollapsingTextHelper.java b/design/src/android/support/design/widget/CollapsingTextHelper.java
index d51a9bb..636770e 100644
--- a/design/src/android/support/design/widget/CollapsingTextHelper.java
+++ b/design/src/android/support/design/widget/CollapsingTextHelper.java
@@ -455,6 +455,7 @@
void setText(CharSequence text) {
if (text == null || !text.equals(mText)) {
mText = text;
+ mTextToDraw = null;
clearTexture();
recalculate();
}
diff --git a/design/src/android/support/design/widget/NavigationView.java b/design/src/android/support/design/widget/NavigationView.java
index 11afbc9..486ce74 100644
--- a/design/src/android/support/design/widget/NavigationView.java
+++ b/design/src/android/support/design/widget/NavigationView.java
@@ -24,6 +24,7 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.DrawableRes;
+import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
@@ -34,6 +35,7 @@
import android.support.v4.view.ViewCompat;
import android.support.v7.internal.view.SupportMenuInflater;
import android.support.v7.internal.view.menu.MenuBuilder;
+import android.support.v7.internal.view.menu.MenuItemImpl;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Menu;
@@ -330,6 +332,18 @@
mPresenter.setItemBackground(itemBackground);
}
+ /**
+ * Sets the currently checked item in this navigation menu.
+ *
+ * @param id The item ID of the currently checked item.
+ */
+ public void setCheckedItem(@IdRes int id) {
+ MenuItem item = mMenu.findItem(id);
+ if (item != null) {
+ mPresenter.setCheckedItem((MenuItemImpl) item);
+ }
+ }
+
private MenuInflater getMenuInflater() {
if (mMenuInflater == null) {
mMenuInflater = new SupportMenuInflater(getContext());