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)
在您的自定义 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)
您是否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)
如果您有任何建议,请发表评论。
我找到了这个解决方案:
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)
| 归档时间: |
|
| 查看次数: |
18031 次 |
| 最近记录: |