如何在android滑动选项卡布局中alignment活动选项卡中心

我有Android项目中的12个项目布局+查看传呼机。 从左向右滑动时,选定的标签应该与Play商店相同。 请帮我怎么做。 在我的应用程序中,活动标签总是在屏幕左侧。

在这里输入图像说明

在这里输入图像说明

Solutions Collecting From Web of "如何在android滑动选项卡布局中alignment活动选项卡中心"

我的方法与Shripad Bhat解决scheme有所不同,它在幻灯片的末尾反弹选项卡。

这是我的解决方法…

onPageScrolled方法的更改:

 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { int tabStripChildCount = mTabStrip.getChildCount(); if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) { return; } mTabStrip.onViewPagerPageChanged(position, positionOffset); View selectedTitle = mTabStrip.getChildAt(position); int selectedOffset = (selectedTitle == null) ? 0 : selectedTitle.getWidth(); int nextTitlePosition = position + 1; View nextTitle = mTabStrip.getChildAt(nextTitlePosition); int nextOffset = (nextTitle == null) ? 0 : nextTitle.getWidth(); int extraOffset = (int)(0.5F * (positionOffset * (float)(selectedOffset + nextOffset))); scrollToTab(position, extraOffset); if (mViewPagerPageChangeListener != null) { mViewPagerPageChangeListener.onPageScrolled(position, positionOffset, positionOffsetPixels); } } 

scrollToTab方法的更改:

 private int mLastScrollTo; private void scrollToTab(int tabIndex, int positionOffset) { final int tabStripChildCount = mTabStrip.getChildCount(); if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { return; } View selectedChild = mTabStrip.getChildAt(tabIndex); if (selectedChild != null && selectedChild.getMeasuredWidth() != 0) { int targetScrollX = ((positionOffset + selectedChild.getLeft()) - getWidth() / 2) + selectedChild.getWidth() / 2; if (targetScrollX != mLastScrollTo) { scrollTo(targetScrollX, 0); mLastScrollTo = targetScrollX; } } } 

Google提供了滑动标签布局的示例。 但是在SlidingTabLayout类的实现中,它并不是为选中的选项卡居中alignment而devise的。 我已经修改滚动方法,使选定/活动选项卡中心的屏幕。 这里是代码更改:

类名称: SlidingTabLayout

行号:241,scrollToTab {}

更新方法:

 private void scrollToTab(int tabIndex, int positionOffset) { final int tabStripChildCount = mTabStrip.getChildCount(); if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { return; } View selectedChild = mTabStrip.getChildAt(tabIndex); if (selectedChild != null) { int targetScrollX = selectedChild.getLeft() + positionOffset; if (tabIndex > 0 || positionOffset > 0) { // If we're not at the first child and are mid-scroll, make sure we obey the offset targetScrollX -= (getWidth()-selectedChild.getWidth())/2; } scrollTo(targetScrollX, 0); } } 

有这个问题。 tabLayout只提供tabContentStart选项,需要双方:

 public class CenteringTabLayout extends TabLayout { public CenteringTabLayout(Context context) { super(context); } public CenteringTabLayout(Context context, AttributeSet attrs) { super(context, attrs); } public CenteringTabLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); View firstTab = ((ViewGroup)getChildAt(0)).getChildAt(0); View lastTab = ((ViewGroup)getChildAt(0)).getChildAt(((ViewGroup)getChildAt(0)).getChildCount()-1); ViewCompat.setPaddingRelative(getChildAt(0), (getWidth()/2) - (firstTab.getWidth()/2),0,(getWidth()/2) - (lastTab.getWidth()/2),0); } }