【问题标题】:Left-right arrow indicators over a ViewPagerViewPager 上的左右箭头指示符
【发布时间】:2014-08-06 09:43:54
【问题描述】:

我想在我的 ViewPager 上显示左右箭头,以指示滑动。

我在 ViewPager 元素上添加了两个 ImageButton,但这些区域会阻止 ViewPager 触发“滑动”。

我还希望按下这些箭头来触发片段进行相应的更改。

简而言之:ImageButtons 不应该干扰滑动,但它们应该注册按下。

我怎样才能做到这一点? 谢谢!

【问题讨论】:

    标签: android android-viewpager swipe


    【解决方案1】:

    下面的代码非常适合我。 注意:使用 FrameLayout,因为它允许重叠视图

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
    
                <android.support.v4.view.ViewPager
                    android:id="@+id/viewpager"
                    android:layout_width="wrap_content"
                    android:layout_height="200dp" />
    
                <ImageButton
                    android:id="@+id/left_nav"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:layout_gravity="center_vertical|left"
                    android:src="@drawable/ic_chevron_left_black_24dp" />
    
                <ImageButton
                    android:id="@+id/right_nav"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:layout_gravity="center_vertical|right"
                    android:src="@drawable/ic_chevron_right_black_24dp" />
    
            </FrameLayout>
    

    下面我用来处理ImageButton的点击事件的部分

    viewPager = (ViewPager) view.findViewById(R.id.viewpager);
    
    leftNav = (ImageButton) view.findViewById(R.id.left_nav);
    rightNav = (ImageButton) view.findViewById(R.id.right_nav);
    
    // Images left navigation
        leftNav.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int tab = viewPager.getCurrentItem();
                if (tab > 0) {
                    tab--;
                    viewPager.setCurrentItem(tab);
                } else if (tab == 0) {
                    viewPager.setCurrentItem(tab);
                }
            }
        });
    
        // Images right navigatin
        rightNav.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int tab = viewPager.getCurrentItem();
                tab++;
                viewPager.setCurrentItem(tab);
            }
        });
    

    输出

    【讨论】:

    • 完美解决方案
    【解决方案2】:

    无需为此管理当前索引或手动处理任何滑动。只需在左右箭头的点击事件上调用viewPager.arrowScroll(int direction)方法即可。

    简而言之,请遵循以下两个简单步骤:

    1. 为左右箭头实现 2 个 ImageViews/ImageButtons/Buttons。
    2. 点击它们后,调用:

      a) 如果单击左箭头 - viewPager.arrowScroll(View.FOCUS_LEFT);

      b) 如果单击右箭头 - viewPager.arrowScroll(View.FOCUS_RIGHT);

    【讨论】:

    • 太棒了!非常感谢:D
    • 如果可行,这是一种简单的方法,但arrowScroll() 并非旨在无条件地向左/向右翻页。它应该向左/向右移动焦点,如果它到达焦点链的末端,则只有向左/向右翻页。因此,如果屏幕上有可聚焦的视图,它可能会以令人困惑的方式失败。请参阅stackoverflow.com/a/57679214/423105 了解该问题,以及@Christopher 对左/右页面的稳健方式的回答。
    【解决方案3】:

    在您的片段中实现左右箭头按钮。然后在您的活动中注册他们的 onClick 并调用 viewpager 的 arrowScroll 方法以编程方式滚动 viewPager。

    public void onRightClick(View view) {
        viewPager.arrowScroll(ViewPager.FOCUS_RIGHT);
    }
    
    public void onLeftClick(View view) {
        viewPager.arrowScroll(ViewPager.FOCUS_LEFT);
    }
    

    创建一个在片段中切换左/右箭头可见性的方法。

    public void toggleArrowVisibility(boolean isAtZeroIndex, boolean isAtLastIndex) {
        if(isAtZeroIndex)
            leftBtn.setVisibility(View.INVISIBLE);
        else
            leftBtn.setVisibility(View.VISIBLE);
        if(isAtLastIndex)
            rightBtn.setVisibility(View.INVISIBLE);
        else
            rightBtn.setVisibility(View.VISIBLE);
    
    }
    

    现在在您的活动中实现 ViewPager.OnPageChangeListener。使用SmartFragmentStatePagerAdapter 跟踪内存中已注册的片段。

    @Override
    public void onPageSelected(int position) {
        MyFragment fragment = (MyFragment) smartAdapter.getRegisteredFragment(position);
        fragment.toggleArrowVisibility(position == 0, position == list.size() - 1);
    }
    

    【讨论】:

    • 感谢您还添加了切换可见性。也非常有用。
    【解决方案4】:

    我现在不使用 ImageButtons 来显示箭头,而是使用 ImageViews,因为它们将任何触摸事件传递给下面的层。

    然后,我将透明按钮放在片段本身上,这样它们不会阻止 ViewPagers 滑动行为,但它们会触发 onClick 事件!

    【讨论】:

    • 您好!我想知道您是否可以通过ImageViews 详细说明您如何或使用哪些箭头来显示。想为我的项目做同样的事情。谢谢!
    • 嗨!不确定我是否理解问题:) 我在 Photoshop 中设计了箭头
    • 好的,有没有需要处理的特定图像格式(jpeg、png、bmp...等)?
    • .png 可能是您的最佳选择,因为它支持透明度!
    • 没问题!随意
    【解决方案5】:

    首先使用相对布局作为你的父布局

    然后在其中添加带有匹配父属性的视图寻呼机

    第三个在视图寻呼机上取两个图像按钮,但在父布局的层次结构下 让它们垂直居中作为重力,并根据您的要求将它们的侧面保持在左右

    第四次为按钮编写功能代码

    第五次采用静态计数器获取当前视图分页页面

    在左右按钮上分别设置减号和加号查看寻呼机计数器。并根据在视图寻呼机中显示数据

    这是代码的简单逻辑,你可以在谷歌上搜索它,你会很容易得到它

    【讨论】:

    • 你能简要说明一下干扰是什么意思吗?你想通过点击按钮来改变页面?
    • 当我用手指在其中一个 ImageButtons 上开始滑动动作时,ViewPager 不会注册滑动。如果不清楚,请见谅!
    • 你注册你的listner for image button了吗?
    • 不,那会有什么不同吗?
    • 是的,如果您为您的活动实现了 onClickListner 并尝试访问 onClick 事件,那么您必须为该视图的对象注册您的 onClickListner。 imgBtn.setOnClickListener(this);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多