如何以编程方式滚动tablayout - Android

Moh*_*dva 21 android android-tabs android-scrollable-tabs android-tablayout

我使用tablayout创建了30个可滚动的选项卡.

因此,屏幕上可以看到前三个选项卡,其余部分是不可见的,可以使用滑动手势滚动.

问题是当我以编程方式选择最后一个选项卡但它不可见时(选项卡布局不会滚动到最后一个选项卡).

如何使tablayout滚动到最后一个标签?

Moh*_*dva 48

我找到了解决方案.

首先,我找到了tablayout的宽度并将其x位置滚动到宽度,然后调用最后一个tab的select()方法.

它工作正常.

下面是代码.

mTabLayout.setScrollX(mTabLayout.getWidth());
mTabLayout.getTabAt(lastTabIndex).select();
Run Code Online (Sandbox Code Playgroud)

更新:

如果上面没有工作,你也可以使用下面的代码,它也工作正常.

new Handler().postDelayed(
        new Runnable() {
            @Override public void run() {
                mTabLayout.getTabAt(TAB_NUMBER).select();
            }
        }, 100);
Run Code Online (Sandbox Code Playgroud)

  • 第二个解决方案是最简单的解决方案,完美的工作。 (2认同)

Ash*_*rma 7

在您的自定义 tablayout(您自己的扩展 tablayout 的布局)中编写此方法。因此,将来您可以在需要复制代码时使用此方法

public void selectTabAt(int tabIndex) {
        if (tabIndex >= 0 && tabIndex < getTabCount() && getSelectedTabPosition() != tabIndex) {
            final Tab currentTab = getTabAt(tabIndex);
            if (currentTab != null) {
                this.post(new Runnable() {
                    @Override
                    public void run() {
                        currentTab.select();
                    }
                });
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果您不想使用 CustomLayout。你可以这样做

final Tab currentTab = mTabLayout.getTabAt(tabIndex);
if(currentTab != null){
     mTabLayout.post(new Runnable() {
                    @Override
                    public void run() {
                        currentTab.select();
                    }
                });
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*nni 5

您是否tab.select()在实际测量和绘制 TabLayout 及其子项之前调用?如果是这样,您的 TabLayout 将不会为选择设置动画tab.select()(或 Kayvan N 对 的建议scrollTo())。使用 Handler 可能会起作用,但这不是理想的解决方案。

如果尚未布局布局,ViewTreeObserver则可以在布局过程完成后移动到所选选项卡。

private void scrollToTabAfterLayout(final int tabIndex) {
    if (getView() != null) {
        final ViewTreeObserver observer = mTabLayout.getViewTreeObserver();

        if (observer.isAlive()) {
            observer.dispatchOnGlobalLayout(); // In case a previous call is waiting when this call is made
            observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        observer.removeOnGlobalLayoutListener(this);
                    } else {
                        //noinspection deprecation
                        observer.removeGlobalOnLayoutListener(this);
                    }

                    mTabLayout.getTabAt(tabIndex).select();

                }
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您有任何建议,请发表评论。


sun*_*er3 5

我找到了这个解决方案:

    TabLayout tabLayout = activity.getTabLayout();
    tabLayout.setSmoothScrollingEnabled(true);
    tabLayout.setScrollPosition(targetChannelPosition, 0f, true);
Run Code Online (Sandbox Code Playgroud)

此外,如果您收到此错误:"只有创建视图层次结构的原始线程可以触摸其视图.",您可以使用此代码,以便在Ui线程上运行:

    // find a way to get the activity containing the tab layout
    TabLayout tabLayout = activity.getTabLayout();
    activity.runOnUiThread(new Runnable()
    {
        @Override
        public void run()
        {
            TabLayout.Tab tab = tabLayout.getTabAt(targetChannelPosition);
            tab.select();
        }
    });
Run Code Online (Sandbox Code Playgroud)