2015-01-04 20 views
8

Tôi có 12 mục trong bố cục tab trượt android + xem máy nhắn tin. Trong khi trượt từ trái sang phải, tab đã chọn phải được căn giữa giống như cửa hàng phát. Xin hãy giúp tôi làm thế nào để làm điều đó. Trong tab hoạt động ứng dụng của tôi luôn ở bên trái màn hình.Cách căn chỉnh trung tâm tab đang hoạt động trong Bố cục tab trượt Android

enter image description here

enter image description here

+0

Bạn đang sử dụng [PagerTabStrip] (http://developer.android.com/reference/android/support/v4/view/PagerTabStrip.html) trong dự án của bạn (đó là ứng dụng Google Play đang sử dụng). Có vẻ như bạn đang sử dụng các tab bình thường thay thế. – Marko

+0

Không, tôi đã sử dụng lớp SlidingTabLayout do google cung cấp làm lớp mẫu cho bố cục tab trượt. Ngoài ra tôi đã thử PagerTabStrip nó không cho phép bạn trượt tiêu đề tab như chơi cửa hàng. SlidingTabLayout được mở rộng HorizontalScrollView. –

+0

Tôi hiểu. Nhìn vào [video] này (https://www.youtube.com/watch?v=tRg_eDfQ8fk) từ các nhà phát triển Android, bạn có thể thấy đây không phải là hành vi mong đợi. Để có được hiệu ứng mà Google Play có, bạn phải sử dụng ** PagerTabStrip **. Nó là siêu dễ thực hiện, thanh toán [hướng dẫn này] (http://codetheory.in/android-pagertabstrip-pagertitlestrip-viewpager/). – Marko

Trả lời

3

Google đã cung cấp mẫu cho sliding tab layout. Nhưng trong việc thực hiện lớp SlidingTabLayout, nó không được thiết kế để căn giữa căn giữa tab đã chọn. Tôi đã sửa đổi phương pháp cuộn để làm cho trung tâm tab đã chọn/hoạt động của màn hình. Phương pháp 241, scrollToTab {}

Cập nhật:: Đây là sự thay đổi mã:

Tên nhóm: Số SlidingTabLayout

Dòng

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); 
    } 
} 
+1

Bạn không cần phải lấy màn hình để đo chiều rộng của scrollview, chỉ cần gọi getWidth();) tức là: targetScrollX - = (getWidth() - selectedChild.getWidth())/2; –

+0

Yuri Heupa, Đã cập nhật câu trả lời. Cảm ơn đề xuất của bạn. –

+0

+1 Nó hoạt động :) Tuy nhiên, có một chút giật ở cuối trong những nỗ lực để đặt nó ở trung tâm. Dưới đây sửa chữa nó. :) Làm tốt lắm. –

12

Tiếp cận của tôi khác một chút là giải pháp Shripad Bhat, trả lại tab ở cuối trang trình bày.

Dưới đây là cách giải quyết của tôi ...

Changes để onPageScrolled phương pháp:

@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); 
    } 
} 

Changes để scrollToTab phương pháp:

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; 
     } 
    } 
} 
+0

Người bạn đời tuyệt vời. Nó hoạt động như nét duyên dáng :) +10 nếu tôi có thể. :) –

+0

LGTM, cảm ơn! : D –

+3

Cảm ơn bạn, nó thật tuyệt vời. Nhưng làm thế nào để làm cho mục tab đầu tiên ở trung tâm? – NickUnuchek

2

có vấn đề này là tốt. tabLayout chỉ cung cấp tabContentStart tùy chọn, cần cả hai bên:

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); 
} 
} 
+0

mã của bạn đang ném một ngoại lệ trên hàng đang sử dụng ViewCompat, bạn có thể vui lòng giải thích mã của bạn nhiều hơn một chút để tôi có thể hiểu những gì bạn thực sự muốn làm. – EyadMhanna

+0

Tôi đã mở rộng android.support.design.widget.TabLayout. Đứa trẻ đầu tiên là SlidingTabStrip và mỗi tab là một trong số các con của nó và tôi đang cố gắng đặt padding thành SlidingTabStrip Nhưng ngay cả khi tôi không tập trung vào các tab cuối cùng một cách cẩn trọng. Vẫn không tìm thấy lý do tại sao. –

Các vấn đề liên quan