【发布时间】:2014-08-06 09:43:54
【问题描述】:
我想在我的 ViewPager 上显示左右箭头,以指示滑动。
我在 ViewPager 元素上添加了两个 ImageButton,但这些区域会阻止 ViewPager 触发“滑动”。
我还希望按下这些箭头来触发片段进行相应的更改。
简而言之:ImageButtons 不应该干扰滑动,但它们应该注册按下。
我怎样才能做到这一点? 谢谢!
【问题讨论】:
标签: android android-viewpager swipe
我想在我的 ViewPager 上显示左右箭头,以指示滑动。
我在 ViewPager 元素上添加了两个 ImageButton,但这些区域会阻止 ViewPager 触发“滑动”。
我还希望按下这些箭头来触发片段进行相应的更改。
简而言之:ImageButtons 不应该干扰滑动,但它们应该注册按下。
我怎样才能做到这一点? 谢谢!
【问题讨论】:
标签: android android-viewpager swipe
下面的代码非常适合我。 注意:使用 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);
}
});
输出
【讨论】:
无需为此管理当前索引或手动处理任何滑动。只需在左右箭头的点击事件上调用viewPager.arrowScroll(int direction)方法即可。
简而言之,请遵循以下两个简单步骤:
点击它们后,调用:
a) 如果单击左箭头 - viewPager.arrowScroll(View.FOCUS_LEFT);
b) 如果单击右箭头 - viewPager.arrowScroll(View.FOCUS_RIGHT);
【讨论】:
arrowScroll() 并非旨在无条件地向左/向右翻页。它应该向左/向右移动焦点,如果它到达焦点链的末端,则只有向左/向右翻页。因此,如果屏幕上有可聚焦的视图,它可能会以令人困惑的方式失败。请参阅stackoverflow.com/a/57679214/423105 了解该问题,以及@Christopher 对左/右页面的稳健方式的回答。
在您的片段中实现左右箭头按钮。然后在您的活动中注册他们的 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);
}
【讨论】:
我现在不使用 ImageButtons 来显示箭头,而是使用 ImageViews,因为它们将任何触摸事件传递给下面的层。
然后,我将透明按钮放在片段本身上,这样它们不会阻止 ViewPagers 滑动行为,但它们会触发 onClick 事件!
【讨论】:
ImageViews 详细说明您如何或使用哪些箭头来显示。想为我的项目做同样的事情。谢谢!
首先使用相对布局作为你的父布局
然后在其中添加带有匹配父属性的视图寻呼机
第三个在视图寻呼机上取两个图像按钮,但在父布局的层次结构下 让它们垂直居中作为重力,并根据您的要求将它们的侧面保持在左右
第四次为按钮编写功能代码
第五次采用静态计数器获取当前视图分页页面
在左右按钮上分别设置减号和加号查看寻呼机计数器。并根据在视图寻呼机中显示数据
这是代码的简单逻辑,你可以在谷歌上搜索它,你会很容易得到它
【讨论】: