Revert "Tidy up TabLayout + ViewPager integration"
Build is still broken in other projects, so reverting for now.
This reverts commit 40f27ea67cb42ab88020275f63cc600fcc42adcb.
Change-Id: I94a6335d10390697e81cba177c9e059b616fedf9
diff --git a/design/api/current.txt b/design/api/current.txt
index d88a7ef..e7c86a0 100644
--- a/design/api/current.txt
+++ b/design/api/current.txt
@@ -227,6 +227,8 @@
method public void addTab(android.support.design.widget.TabLayout.Tab, int);
method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
+ method public void addTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
+ method public android.support.v4.view.ViewPager.OnPageChangeListener createOnPageChangeListener();
method public android.support.design.widget.TabLayout.Tab getTabAt(int);
method public int getTabCount();
method public int getTabGravity();
@@ -242,8 +244,6 @@
method public void setTabMode(int);
method public void setTabTextColors(android.content.res.ColorStateList);
method public void setTabTextColors(int, int);
- method public void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
- method public void setupWithViewPager(android.support.v4.view.ViewPager);
field public static final int GRAVITY_CENTER = 1; // 0x1
field public static final int GRAVITY_FILL = 0; // 0x0
field public static final int MODE_FIXED = 1; // 0x1
@@ -275,20 +275,6 @@
field public static final int INVALID_POSITION = -1; // 0xffffffff
}
- public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
- ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
- method public void onPageScrollStateChanged(int);
- method public void onPageScrolled(int, float, int);
- method public void onPageSelected(int);
- }
-
- public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
- ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
- method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
- method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
- method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
- }
-
public class TextInputLayout extends android.widget.LinearLayout {
ctor public TextInputLayout(android.content.Context);
ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
diff --git a/design/src/android/support/design/widget/TabLayout.java b/design/src/android/support/design/widget/TabLayout.java
index e475040..05cb354 100755
--- a/design/src/android/support/design/widget/TabLayout.java
+++ b/design/src/android/support/design/widget/TabLayout.java
@@ -51,7 +51,6 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Iterator;
@@ -71,14 +70,14 @@
* notified when any tab's selection state has been changed.
* <p>
* If you're using a {@link android.support.v4.view.ViewPager} together
- * with this layout, you can use {@link #setTabsFromPagerAdapter(PagerAdapter)} which will populate
- * the tabs using the given {@link PagerAdapter}'s page titles. You should also use a
- * {@link TabLayoutOnPageChangeListener} to forward the scroll and selection changes to this
- * layout like so:
+ * with this layout, you can use {@link #addTabsFromPagerAdapter(PagerAdapter)} which will populate
+ * the tabs using the {@link PagerAdapter}'s page titles. You should also use a {@link
+ * ViewPager.OnPageChangeListener} to forward the scroll and selection changes to this layout.
+ * You can use the one returned {@link #createOnPageChangeListener()} for easy implementation:
* <pre>
* ViewPager viewPager = ...;
* TabLayout tabLayout = ...;
- * viewPager.addOnPageChangeListener(new TabLayoutOnPageChangeListener(tabLayout));
+ * viewPager.setOnPageChangeListener(tabLayout.createOnPageChangeListener());
* </pre>
*
* @see <a href="http://www.google.com/design/spec/components/tabs.html">Tabs</a>
@@ -271,7 +270,7 @@
/**
* Set the scroll position of the tabs. This is useful for when the tabs are being displayed as
- * part of a scrolling container such as {@link android.support.v4.view.ViewPager}.
+ * part of a scrolling container such as {@link ViewPager}.
* <p>
* Calling this method does not update the selected tab, it is only used for drawing purposes.
*
@@ -298,6 +297,51 @@
}
/**
+ * Add new {@link Tab}s populated from a {@link PagerAdapter}. Each tab will have it's text set
+ * to the value returned from {@link PagerAdapter#getPageTitle(int)}.
+ *
+ * @param adapter the adapter to populate from
+ */
+ public void addTabsFromPagerAdapter(PagerAdapter adapter) {
+ for (int i = 0, count = adapter.getCount(); i < count; i++) {
+ addTab(newTab().setText(adapter.getPageTitle(i)));
+ }
+ }
+
+ /**
+ * Create a {@link ViewPager.OnPageChangeListener} which implements the
+ * necessary calls back to this layout so that the tabs position is kept in sync.
+ * <p>
+ * If you need to have a custom {@link ViewPager.OnPageChangeListener} for your own
+ * purposes, you can still use the instance returned from this method, but making sure to call
+ * through to all of the methods.
+ */
+ public ViewPager.OnPageChangeListener createOnPageChangeListener() {
+ return new ViewPager.OnPageChangeListener() {
+ private int mScrollState;
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ mScrollState = state;
+ }
+
+ @Override
+ public void onPageScrolled(int position, float positionOffset,
+ int positionOffsetPixels) {
+ // Update the scroll position, only update the text selection if we're being
+ // dragged
+ setScrollPosition(position, positionOffset,
+ mScrollState == ViewPager.SCROLL_STATE_DRAGGING);
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ getTabAt(position).select();
+ }
+ };
+ }
+
+ /**
* Add a tab to this layout. The tab will be added at the end of the list.
* If this is the first tab to be added it will become the selected tab.
*
@@ -356,8 +400,7 @@
}
/**
- * Set the {@link android.support.design.widget.TabLayout.OnTabSelectedListener} that will
- * handle switching to and from tabs.
+ * Set the {@link android.support.design.widget.TabLayout.OnTabSelectedListener} that will handle switching to and from tabs.
*
* @param onTabSelectedListener Listener to handle tab selection events
*/
@@ -453,7 +496,7 @@
* <li>{@link #MODE_SCROLLABLE}: Scrollable tabs display a subset of tabs at any given moment,
* and can contain longer tab labels and a larger number of tabs. They are best used for
* browsing contexts in touch interfaces when users don’t need to directly compare the tab
- * labels. This mode is commonly used with a {@link android.support.v4.view.ViewPager}.</li>
+ * labels. This mode is commonly used with a {@link ViewPager}.</li>
* </ul>
*
* @param mode one of {@link #MODE_FIXED} or {@link #MODE_SCROLLABLE}.
@@ -521,55 +564,6 @@
setTabTextColors(createColorStateList(normalColor, selectedColor));
}
- /**
- * The one-stop shop for setting up this {@link TabLayout} with a {@link ViewPager}.
- *
- * <p>This method will:
- * <ul>
- * <li>Add a {@link ViewPager.OnPageChangeListener} that will forward events to
- * this TabLayout.</li>
- * <li>Populate the TabLayout's tabs from the ViewPager's {@link PagerAdapter}.</li>
- * <li>Set our {@link TabLayout.OnTabSelectedListener} which will forward
- * selected events to the ViewPager</li>
- * </ul>
- * </p>
- *
- * @see #setTabsFromPagerAdapter(PagerAdapter)
- * @see TabLayoutOnPageChangeListener
- * @see ViewPagerOnTabSelectedListener
- */
- public void setupWithViewPager(ViewPager viewPager) {
- final PagerAdapter adapter = viewPager.getAdapter();
- if (adapter == null) {
- throw new IllegalArgumentException("ViewPager does not have a PagerAdapter set");
- }
-
- // First we'll add Tabs, using the adapter's page titles
- setTabsFromPagerAdapter(adapter);
-
- // Now we'll add our page change listener to the ViewPager
- viewPager.addOnPageChangeListener(new TabLayoutOnPageChangeListener(this));
-
- // Now we'll add a tab selected listener to set ViewPager's current item
- setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));
- }
-
- /**
- * Populate our tab content from the given {@link PagerAdapter}.
- * <p>
- * Any existing tabs will be removed first. Each tab will have it's text set to the value
- * returned from {@link PagerAdapter#getPageTitle(int)}
- * </p>
- *
- * @param adapter the adapter to populate from
- */
- public void setTabsFromPagerAdapter(PagerAdapter adapter) {
- removeAllTabs();
- for (int i = 0, count = adapter.getCount(); i < count; i++) {
- addTab(newTab().setText(adapter.getPageTitle(i)));
- }
- }
-
private void updateAllTabs() {
for (int i = 0, z = mTabStrip.getChildCount(); i < z; i++) {
updateTab(i);
@@ -1426,75 +1420,4 @@
}
}
- /**
- * A {@link ViewPager.OnPageChangeListener} class which contains the
- * necessary calls back to the provided {@link TabLayout} so that the tab position is
- * kept in sync.
- *
- * <p>This class stores the provided TabLayout weakly, meaning that you can use
- * {@link ViewPager#addOnPageChangeListener(ViewPager.OnPageChangeListener)
- * addOnPageChangeListener(OnPageChangeListener)} without removing the listener and
- * not cause a leak.
- */
- public static class TabLayoutOnPageChangeListener implements ViewPager.OnPageChangeListener {
- private final WeakReference<TabLayout> mTabLayoutRef;
- private int mScrollState;
-
- public TabLayoutOnPageChangeListener(TabLayout tabLayout) {
- mTabLayoutRef = new WeakReference<>(tabLayout);
- }
-
- @Override
- public void onPageScrollStateChanged(int state) {
- mScrollState = state;
- }
-
- @Override
- public void onPageScrolled(int position, float positionOffset,
- int positionOffsetPixels) {
- final TabLayout tabLayout = mTabLayoutRef.get();
- if (tabLayout != null) {
- // Update the scroll position, only update the text selection if we're being
- // dragged
- tabLayout.setScrollPosition(position, positionOffset,
- mScrollState == ViewPager.SCROLL_STATE_DRAGGING);
- }
- }
-
- @Override
- public void onPageSelected(int position) {
- final TabLayout tabLayout = mTabLayoutRef.get();
- if (tabLayout != null) {
- tabLayout.getTabAt(position).select();
- }
- }
- }
-
- /**
- * A {@link TabLayout.OnTabSelectedListener} class which contains the necessary calls back
- * to the provided {@link ViewPager} so that the tab position is kept in sync.
- */
- public static class ViewPagerOnTabSelectedListener implements TabLayout.OnTabSelectedListener {
- private final ViewPager mViewPager;
-
- public ViewPagerOnTabSelectedListener(ViewPager viewPager) {
- mViewPager = viewPager;
- }
-
- @Override
- public void onTabSelected(TabLayout.Tab tab) {
- mViewPager.setCurrentItem(tab.getPosition());
- }
-
- @Override
- public void onTabUnselected(TabLayout.Tab tab) {
- // No-op
- }
-
- @Override
- public void onTabReselected(TabLayout.Tab tab) {
- // No-op
- }
- }
-
}
diff --git a/v4/api/current.txt b/v4/api/current.txt
index b0600dc..41e3610 100644
--- a/v4/api/current.txt
+++ b/v4/api/current.txt
@@ -2309,11 +2309,9 @@
public class ViewPager extends android.view.ViewGroup {
ctor public ViewPager(android.content.Context);
ctor public ViewPager(android.content.Context, android.util.AttributeSet);
- method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
method public boolean arrowScroll(int);
method public boolean beginFakeDrag();
method protected boolean canScroll(android.view.View, boolean, int, int, int);
- method public void clearOnPageChangeListeners();
method public void endFakeDrag();
method public boolean executeKeyEvent(android.view.KeyEvent);
method public void fakeDragBy(float);
@@ -2326,12 +2324,11 @@
method protected void onPageScrolled(int, float, int);
method public void onRestoreInstanceState(android.os.Parcelable);
method public android.os.Parcelable onSaveInstanceState();
- method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
method public void setAdapter(android.support.v4.view.PagerAdapter);
method public void setCurrentItem(int);
method public void setCurrentItem(int, boolean);
method public void setOffscreenPageLimit(int);
- method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+ method public void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
method public void setPageMargin(int);
method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
method public void setPageMarginDrawable(int);
diff --git a/v4/java/android/support/v4/view/ViewPager.java b/v4/java/android/support/v4/view/ViewPager.java
index 57152c2..92596fc 100644
--- a/v4/java/android/support/v4/view/ViewPager.java
+++ b/v4/java/android/support/v4/view/ViewPager.java
@@ -55,7 +55,6 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
-import java.util.List;
/**
* Layout manager that allows the user to flip left and right
@@ -214,7 +213,6 @@
private boolean mCalledSuper;
private int mDecorChildCount;
- private List<OnPageChangeListener> mOnPageChangeListeners;
private OnPageChangeListener mOnPageChangeListener;
private OnPageChangeListener mInternalPageChangeListener;
private OnAdapterChangeListener mAdapterChangeListener;
@@ -400,7 +398,9 @@
// PageTransformers can do complex things that benefit from hardware layers.
enableLayers(newState != SCROLL_STATE_IDLE);
}
- dispatchOnScrollStateChanged(newState);
+ if (mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageScrollStateChanged(newState);
+ }
}
/**
@@ -543,8 +543,11 @@
// We don't have any idea how big we are yet and shouldn't have any pages either.
// Just set things up and let the pending layout handle things.
mCurItem = item;
- if (dispatchSelected) {
- dispatchOnPageSelected(item);
+ if (dispatchSelected && mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageSelected(item);
+ }
+ if (dispatchSelected && mInternalPageChangeListener != null) {
+ mInternalPageChangeListener.onPageSelected(item);
}
requestLayout();
} else {
@@ -564,12 +567,18 @@
}
if (smoothScroll) {
smoothScrollTo(destX, 0, velocity);
- if (dispatchSelected) {
- dispatchOnPageSelected(item);
+ if (dispatchSelected && mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageSelected(item);
+ }
+ if (dispatchSelected && mInternalPageChangeListener != null) {
+ mInternalPageChangeListener.onPageSelected(item);
}
} else {
- if (dispatchSelected) {
- dispatchOnPageSelected(item);
+ if (dispatchSelected && mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageSelected(item);
+ }
+ if (dispatchSelected && mInternalPageChangeListener != null) {
+ mInternalPageChangeListener.onPageSelected(item);
}
completeScroll(false);
scrollTo(destX, 0);
@@ -582,54 +591,12 @@
* scrolled. See {@link OnPageChangeListener}.
*
* @param listener Listener to set
- *
- * @deprecated Use {@link #addOnPageChangeListener(OnPageChangeListener)}
- * and {@link #removeOnPageChangeListener(OnPageChangeListener)} instead.
*/
- @Deprecated
public void setOnPageChangeListener(OnPageChangeListener listener) {
mOnPageChangeListener = listener;
}
/**
- * Add a listener that will be invoked whenever the page changes or is incrementally
- * scrolled. See {@link OnPageChangeListener}.
- *
- * <p>Components that add a listener should take care to remove it when finished.
- * Other components that take ownership of a view may call {@link #clearOnPageChangeListeners()}
- * to remove all attached listeners.</p>
- *
- * @param listener listener to add
- */
- public void addOnPageChangeListener(OnPageChangeListener listener) {
- if (mOnPageChangeListeners == null) {
- mOnPageChangeListeners = new ArrayList<>();
- }
- mOnPageChangeListeners.add(listener);
- }
-
- /**
- * Remove a listener that was previously added via
- * {@link #addOnPageChangeListener(OnPageChangeListener)}.
- *
- * @param listener listener to remove
- */
- public void removeOnPageChangeListener(OnPageChangeListener listener) {
- if (mOnPageChangeListeners != null) {
- mOnPageChangeListeners.remove(listener);
- }
- }
-
- /**
- * Remove all listeners that are notified of any changes in scroll state or position.
- */
- public void clearOnPageChangeListeners() {
- if (mOnPageChangeListeners != null) {
- mOnPageChangeListeners.clear();
- }
- }
-
- /**
* Set a {@link PageTransformer} that will be called for each attached page whenever
* the scroll position is changed. This allows the application to apply custom property
* transformations to each page, overriding the default sliding look and feel.
@@ -1745,7 +1712,12 @@
}
}
- dispatchOnPageScrolled(position, offset, offsetPixels);
+ if (mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageScrolled(position, offset, offsetPixels);
+ }
+ if (mInternalPageChangeListener != null) {
+ mInternalPageChangeListener.onPageScrolled(position, offset, offsetPixels);
+ }
if (mPageTransformer != null) {
final int scrollX = getScrollX();
@@ -1764,57 +1736,6 @@
mCalledSuper = true;
}
- private void dispatchOnPageScrolled(int position, float offset, int offsetPixels) {
- if (mOnPageChangeListener != null) {
- mOnPageChangeListener.onPageScrolled(position, offset, offsetPixels);
- }
- if (mOnPageChangeListeners != null) {
- for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
- OnPageChangeListener listener = mOnPageChangeListeners.get(i);
- if (listener != null) {
- listener.onPageScrolled(position, offset, offsetPixels);
- }
- }
- }
- if (mInternalPageChangeListener != null) {
- mInternalPageChangeListener.onPageScrolled(position, offset, offsetPixels);
- }
- }
-
- private void dispatchOnPageSelected(int position) {
- if (mOnPageChangeListener != null) {
- mOnPageChangeListener.onPageSelected(position);
- }
- if (mOnPageChangeListeners != null) {
- for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
- OnPageChangeListener listener = mOnPageChangeListeners.get(i);
- if (listener != null) {
- listener.onPageSelected(position);
- }
- }
- }
- if (mInternalPageChangeListener != null) {
- mInternalPageChangeListener.onPageSelected(position);
- }
- }
-
- private void dispatchOnScrollStateChanged(int state) {
- if (mOnPageChangeListener != null) {
- mOnPageChangeListener.onPageScrollStateChanged(state);
- }
- if (mOnPageChangeListeners != null) {
- for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
- OnPageChangeListener listener = mOnPageChangeListeners.get(i);
- if (listener != null) {
- listener.onPageScrollStateChanged(state);
- }
- }
- }
- if (mInternalPageChangeListener != null) {
- mInternalPageChangeListener.onPageScrollStateChanged(state);
- }
- }
-
private void completeScroll(boolean postEvents) {
boolean needPopulate = mScrollState == SCROLL_STATE_SETTLING;
if (needPopulate) {