android TabLayout删除不必要的滚动

k75qkfdt  于 2023-01-03  发布在  Android
关注(0)|答案(7)|浏览(215)

我遇到了与android TabLayout棘手的问题

import android.support.design.widget.TabLayout;

当我选择左边最前面的标签页,然后向右滚动标签页并选择右边最前面的标签页时,TabLayout首先再次显示左边的标签页,然后向右滚动到所选的标签页。

void setupTabs(ViewPager viewPager, TabLayout tabLayout) {
       ProductsPagerAdapter adapter = new ProductsPagerAdapter(getChildFragmentManager(), rootCategory.getChildCategories());
       viewPager.setAdapter(adapter);
       tabLayout.setupWithViewPager(viewPager);

       setStartingSelection(viewPager, adapter);

   }

    private void setStartingSelection(ViewPager viewPager, ProductsPagerAdapter adapter) {
        for(int i = 0 ; i < adapter.getCount(); i++){
            String title = (String) adapter.getPageTitle(i);
            if(title.equals(selectedCategory.getName())){
                viewPager.setCurrentItem(i);
                break;
            }
        }
    }

和布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/toolbar_color"
            app:navigationIcon="@drawable/ic_back_white"
            app:title="@string/title_transport"
            app:titleTextColor="@color/title_color"/>

        <android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMode="scrollable"
            app:tabTextColor="@color/white"
            app:tabIndicatorColor="@color/tab_indicator"
            app:tabGravity="fill"/>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:background="@android:color/white" />

</LinearLayout>
vsikbqxv

vsikbqxv1#

你可以试试这个代码

tabLayout.setupWithViewPager(viewPager);
    // little hack to prevent unnecessary tab scrolling
    tabLayout.clearOnTabSelectedListeners();
    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition(), false);
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) { }

        @Override
        public void onTabReselected(TabLayout.Tab tab) { }
    });

也可以直接对最后一行执行此操作

tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager) {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        viewPager.setCurrentItem(tab.getPosition(), false);
    }
});
wxclj1h5

wxclj1h52#

实际上你正在处理滚动问题。是的。问题是,TabLayout扩展了HorizontalScrollView。尝试类似这样的东西。

public class CustomTabLayout extends TabLayout {

public CustomTabLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

public CustomTabLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public CustomTabLayout(Context context) {
    super(context);
    init(context);
}

void init(Context ctx){

}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    // Do not allow touch events.
    return false;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    // Do not allow touch events.
    return false;
}

}
mkh04yzy

mkh04yzy3#

我认为使用TabLayoutMediator是值得的
它看起来就像这样

TabLayoutMediator(tabs, view_pager, true, false) { tab, position ->
        tab.text = ""
}.attach()
kh212irz

kh212irz4#

按如下所示更改方法:

private void setStartingSelection(ViewPager viewPager, ProductsPagerAdapter adapter) {
        int tabPosition=0;
        for(int i = 0 ; i < adapter.getCount(); i++){
            String title = (String) adapter.getPageTitle(i);
            if(title.equals(selectedCategory.getName())){
                tabPosition=i;
                break;
            }
        }
        viewPager.setCurrentItem(tabPosition);
    }

希望这对你有帮助。

i34xakig

i34xakig5#

经过大量的搜索,我明白我需要另一个组件,它看起来像TabLayout,但不会是TabLayout。所以我使用ViewPagerIndicator
它与TabLayout非常相似,虽然它缺少TabLayout中存在的很酷的选择动画和选定的制表符动画。它也不会调整文本大小以适应制表符,这很好,也不会调整制表符大小以适应文本,这很糟糕(尝试了我知道的所有样式参数-无法使其换行)。
但它选择标签很好,没有额外的滚动。不幸的是,AndroidArsenal没有包含解决方案,这比这更好(至少我搜索时没有)。

but5z9lq

but5z9lq6#

你可以使用这个自定义的ViewPager,也许它可以帮助你:)

public class NonSmoothViewPager extends ViewPager {

    private boolean mIsEnabledSwipe = true;

    public NonSmoothViewPager(Context context) {
        super(context);
    }

    public NonSmoothViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setEnabledSwipe(boolean isEnabledSwipe) {
        mIsEnabledSwipe = isEnabledSwipe;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return mIsEnabledSwipe && super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return mIsEnabledSwipe && super.onInterceptTouchEvent(event);

    }

    @Override
    public void setCurrentItem(int item) {
        super.setCurrentItem(item, false);
    }

    @Override
    public void setCurrentItem(int item, boolean smoothScroll) {
        super.setCurrentItem(item, false);
    }
}
wz8daaqr

wz8daaqr7#

尝试到wrap制表布局在水平scoll视图象这样

<HorizontalScrollView
            android:id="@+id/horizontal_scroll"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/VW_C1">

            <com.google.android.material.tabs.TabLayout
                android:id="@+id/RankList"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@color/white"
                app:tabIndicator="@color/white"
                app:tabMode="scrollable" />

        </HorizontalScrollView>

相关问题