我在android滑动标签布局+视图寻呼机中有12个项目。从左向右滑动时,所选标签应与播放商店中心相同。请帮我怎么做。在我的应用程序中,活动选项卡始终保留在屏幕上。
答案 0 :(得分:12)
我的方法与Shripad Bhat解决方案略有不同,后者在幻灯片末尾弹出了标签。
这是我的解决方法......
对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;
}
}
}
答案 1 :(得分:3)
Google已为sliding tab layout提供了示例。但是在SlidingTabLayout类的实现中,它并不是为中心对齐选定的选项卡而设计的。我已修改滚动方法以使屏幕的选定/活动标签中心。这是代码更改:
班级名称: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);
}
}
答案 2 :(得分:2)
也有这个问题。 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);
}
}