美文网首页
TabLayout选择指定位置,并且滑动到该位置

TabLayout选择指定位置,并且滑动到该位置

作者: 木小伍 | 来源:发表于2018-07-16 16:00 被阅读0次

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

    注意:以上代码仅仅对tab的数量在比较少的情况下可以使用(8个左右,而且并不能保证在屏幕的正中间),偏移量的大小取决于item的控件的大小,是不确定的。

    相关文章

      网友评论

          本文标题:TabLayout选择指定位置,并且滑动到该位置

          本文链接:https://www.haomeiwen.com/subject/ksdbpftx.html