【问题标题】:Android tab behaviorAndroid 选项卡行为
【发布时间】:2018-04-03 18:07:03
【问题描述】:

我正在设计类似标签视图的功能,但我需要更多功能。

假设我有三个标签,

如果按 tab2 - 第二个标签的内容将显示 tab3 -- 第三个的内容将显示 tab1 - 将显示 tab1 的内容

默认情况下会选择 tab1。这工作正常。

现在,当我浏览 tab1 的内容时,我还需要显示第二个标签的内容(但应该选择第二个标签)..就像网络上的单页应用程序..

我不需要 Web 视图。任何人都可以指导我如何实现这一点,或者 github 上是否有任何示例代码。请

谢谢

【问题讨论】:

  • 好像你想做一个循环的viewpager,看看looping viewpager
  • 是的,类似。但我也需要这个滚动。当我滚动时,它会改变位置acc。不刷卡
  • 我明白了你的想法,我会做一个 sn-p tmr
  • @LinhNguyen 谢谢
  • 所以你想在到达当前标签页末尾时自动切换标签页?

标签: android listview tabs


【解决方案1】:

@AnkitaKashyap 对不起,伙计,我一直忘了,这是你的 sn-p 代码(在 kotlin 中)如果你需要帮助,请给我发私信,如果我的想法正确,这就是你想要的 gif demo : 使用带有 recyclerview 的标签栏并设置 addOnTabSelectedListener:

productTabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener{
        override fun onTabReselected(tab: TabLayout.Tab?) {

        }

        override fun onTabUnselected(tab: TabLayout.Tab?) {
        }

        override fun onTabSelected(tab: TabLayout.Tab?) {


                productRv.scrollToPosition(tab?.position?:0)
        }
    })

并在您的回收站视图中设置:

productRv.addOnScrollListener(object : RecyclerView.OnScrollListener(){
        override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            var scrollPosition = layoutManager.findFirstVisibleItemPosition()

            productTabs.getTabAt(scrollPosition)?.select()


        }

        override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
            super.onScrollStateChanged(recyclerView, newState)
        }
    })

【讨论】:

    【解决方案2】:

    您需要使用VerticalViewPager,如 StackOverflow 帖子中所示,并使用 TabLayout。

    来自给定 SO 链接的代码:

    /**
     * Uses a combination of a PageTransformer and swapping X & Y coordinates
     * of touch events to create the illusion of a vertically scrolling ViewPager. 
     * 
     * Requires API 11+
     * 
     */
    public class VerticalViewPager extends ViewPager {
    
        public VerticalViewPager(Context context) {
            super(context);
            init();
        }
    
        public VerticalViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        private void init() {
            // The majority of the magic happens here
            setPageTransformer(true, new VerticalPageTransformer());
            // The easiest way to get rid of the overscroll drawing that happens on the left and right
            setOverScrollMode(OVER_SCROLL_NEVER);
        }
    
        private class VerticalPageTransformer implements ViewPager.PageTransformer {
    
            @Override
            public void transformPage(View view, float position) {
    
                if (position < -1) { // [-Infinity,-1)
                    // This page is way off-screen to the left.
                    view.setAlpha(0);
    
                } else if (position <= 1) { // [-1,1]
                    view.setAlpha(1);
    
                    // Counteract the default slide transition
                    view.setTranslationX(view.getWidth() * -position);
    
                    //set Y position to swipe in from top
                    float yPosition = position * view.getHeight();
                    view.setTranslationY(yPosition);
    
                } else { // (1,+Infinity]
                    // This page is way off-screen to the right.
                    view.setAlpha(0);
                }
            }
        }
    
        /**
         * Swaps the X and Y coordinates of your touch event.
         */
        private MotionEvent swapXY(MotionEvent ev) {
            float width = getWidth();
            float height = getHeight();
    
            float newX = (ev.getY() / height) * width;
            float newY = (ev.getX() / width) * height;
    
            ev.setLocation(newX, newY);
    
            return ev;
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev){
            boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
            swapXY(ev); // return touch coordinates to original reference frame for any child views
            return intercepted;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            return super.onTouchEvent(swapXY(ev));
        }
    
    }
    

    【讨论】:

    • 是的。但是如何更改与其选择相对应的选项卡
    • 您可以将 addOnPageChangeListener 设置为您的 viewPager 并在 onPageSelected 回调方法中设置 tabLayout 位置
    • viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { tabLayout.setScrollPosition(position,0f,true); } });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2017-06-20
    • 2010-09-19
    相关资源
    最近更新 更多