我有一个带有网页视图的viewpager,可以向左和向右滚动。 用户可以拥有未保存的数据,在这种情况下我想禁用viewpager,如果用户试图滚动页面,我想显示一个未保存的对话窗口。
I looked at this solution但它并不是我需要的东西。由于始终返回true将禁用我的片段的webview也不会滚动。
public class CustomViewPager extends ViewPager {
private boolean isPagingEnabled = true;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return this.isPagingEnabled && super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return this.isPagingEnabled && super.onInterceptTouchEvent(event);
}
public void setPagingEnabled(boolean b) {
this.isPagingEnabled = b;
}
}
目前,我有一个自定义webview,我覆盖onTouch,并检查我是否可以水平滚动。我有一个方法可以检查我的webview是否可以向左或向右滚动。这似乎工作正常。
public boolean canScrollHorizontally(int direction){
final int offset = computeHorizontalScrollOffset();
final int range = computeHorizontalScrollRange() -computeHorizontalScrollExtent();
if (range == 0) return false;
if (direction < 0) {
return offset > 0;
} else {
return offset < range - 1;
}
}
我的网页浏览器上有一个ontouch监听器,我相信它工作正常吗?如果我返回true,如果用户尝试向左拖动并且视图有空间可以拖动。如果没有,我返回false,希望将事件传递给viewpager。
public boolean onTouchEvent(MotionEvent event) {
float x;
float y;
x = event.getX();
y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mStartDragX = x;
mStartDragY = y;
break;
case MotionEvent.ACTION_MOVE:
if(Math.abs(mStartDragX - ev.getX()) > SWIPE_MIN_DISTANCE){
if (mStartDragX < x && canScrollHorizontally(-1)) {
// Left to Right
return true;
} else if(mStartDragX > x && canScrollHorizontally(1)){
// Right to Left
return true;
}else{
// pass to viewpager?
return false;
}
}
}
return super.onTouchEvent(event);
}
我的viewtager的ontouch事件是我迷失了一点,如果Pager被禁用了。我想向用户显示一个对话框。
@Override
public boolean onTouchEvent(MotionEvent ev) {
float x;
float y;
if(this.enabled) {
return super.onTouchEvent(ev);
} else{
x = ev.getX();
y = ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mStartDragX = x;
mStartDragY = y;
break;
case MotionEvent.ACTION_MOVE:
if(Math.abs(mStartDragX - ev.getX()) > SWIPE_MIN_DISTANCE){
showDialog()??
}
}
}
return true;
}
有人可以提出最佳方法吗?
答案 0 :(得分:0)
你可以实现这一目标的一种可能方法是改变驱动ViewPager的PagerAdapter的状态,以便它只显示一个视图 - 被锁定的视图。解锁时,您将回滚PagerAdapter以获得所有视图。这项工作的诀窍是仔细实施getItemPosition()
,以便您锁定的网页不会被删除并重新添加。
例如:
public void setLocked(boolean isLocked) {
mIsLocked = isLocked;
notifyDataSetChanged();
}
@Override
public int getCount() {
return mIsLocked ? 1 : mViews.size();
}
我遇到过一种情况,即视图的添加/删除/重新排序非常复杂,我最终编写了一个完整的PagerAdapter实现。