(2018.7.28)特地来更新:对于之前看到了这篇博客的同仁们,只能说:很抱歉把你们带坑里去了(如果有人看的话)。目前最简单粗暴的实现思路:
利用延时,让view初始化完毕之后,直接通过自身的特点滑动到指定的位置
tablayout.postDelayed(new Runnable() {
@Override
public void run() {
tablayout.getTabAt(position).select();
}
}, 100);
上面的方法对tab的个数没有限制。
实现思路(这个思路是个坑,但是我还是要留在这里):
滑动的距离 = 滑动的位置 x 每个item 的宽度+偏移量
实现代码如下:
//初始化tablayout数据
private void initTab() {
int position = getIntent().getIntExtra("position", 0);
for (int i = 0, length = titles.length; i < length; i++) {
TabLayout.Tab tabAt = tablayout.newTab();
tabAt.setCustomView(R.layout.tab_item_layout);
TextView tab_title = (TextView) tabAt.getCustomView().findViewById(R.id.title_value);
tab_title.setGravity(Gravity.CENTER);
tab_title.setText(titles[i]);
tablayout.addTab(tabAt);
}
setDefaultTable(position, true);
}
/**
* 选择默认的选中项
*
* @param position 注意下角标从0开始
* @param needScroll 仅仅第一次需要滑动
*/
public void setDefaultTable(int position, boolean needScroll) {
if (position < 0)
position = 0;
if (position >= titles.length)
position = titles.length - 1;
tablayout.getTabAt(position).select();
if (tablayout.getTabAt(position).isSelected()) {
View customView = tablayout.getTabAt(position).getCustomView();
TextView tab_title = (TextView) customView.findViewById(R.id.title_value);
tab_title.setGravity(Gravity.CENTER);
if (needScroll) {
int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
tab_title.measure(spec, spec);
int measuredWidthTicketNum = tab_title.getMeasuredWidth();
// measuredWidthTicketNum = px2dp(measuredWidthTicketNum);
Log.i("TAG", "条目的宽度是" + measuredWidthTicketNum);
Log.i("TAG", "mWidth=" + mWidth);
recomputeTlOffset1(position, measuredWidthTicketNum);
}
}
}
/**
* 重新计算需要滚动的距离
*
* @param index 选择的tab的下标
*/
private void recomputeTlOffset1(int index, int viewWidth) {
if (tablayout.getTabAt(index) != null) tablayout.getTabAt(index).select();
//加上半个item的宽度(这个需要自己微调,不一定是半个)如果有设置margin还需要加上margin的距离
int halfWidth = viewWidth / 2; //偏移量
final int width = ((viewWidth + halfWidth) * index);
Log.i("TAG", "tablayout.getResources().getDisplayMetrics().density=" + tablayout.getResources().getDisplayMetrics().density);
Log.i("TAG", "移动的距离是" + width);
tablayout.post(new Runnable() {
@Override
public void run() {
tablayout.smoothScrollTo(width, 0);
}
});
}
网友评论