我的布局在自定义ViewPager
内部有ScrollView
,而ViewPager不会垂直滚动。自定义ScrollView用于修复使用ScrollView滑动的可怕选项卡。
是的,有足够的内容可以滚动,我尝试使用和不使用底部按钮。
我正在使用包含3个标签的ActionBar,当前代码允许向左/向右滑动就好了。
我的目标是为一些动作项目设置底部栏,例如保存和取消,以及ActionBar和底部按钮之间的部分是将垂直滚动的ViewPager。
我尝试过太多组合,现在给你寄这封情书。有任何想法吗?如有需要,我们非常感谢您提供帮助。
main.xml中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/footer"
style="@android:style/Holo.ButtonBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal" >
<Button
android:id="@+id/saveButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Save" />
<Button
android:id="@+id/cancelButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cancel" />
</LinearLayout>
<com.blah.hootiehoo.ViewPagerCompatScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@id/footer"
android:fillViewport="true" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:scrollbarAlwaysDrawVerticalTrack="true"
android:scrollbars="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:scrollbarAlwaysDrawVerticalTrack="true"
android:scrollbars="vertical" >
</android.support.v4.view.ViewPager>
</LinearLayout>
</com.blah.hootiehoo.ViewPagerCompatScrollView>
</RelativeLayout>
MainActivity.java
ViewPager mViewPager;
TabsAdapter mTabsAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mViewPager = (ViewPager)findViewById(R.id.pager);
// setup action bar for tabs
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
mTabsAdapter = new TabsAdapter(this, mViewPager);
Tab tab = actionBar.newTab();
// tab setup
mTabsAdapter.addTab(/*** stuff ***/);
// add 2 more tabs, etc
}
ViewPagerCompatScrollView.java Got from here, at bottom
public class ViewPagerCompatScrollView extends ScrollView {
private float xDistance, yDistance, lastX, lastY;
public ViewPagerCompatScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
lastX = ev.getX();
lastY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - lastX);
yDistance += Math.abs(curY - lastY);
lastX = curX;
lastY = curY;
if(xDistance > yDistance)
return false;
}
return super.onInterceptTouchEvent(ev);
}
}
答案 0 :(得分:8)
根据之前的评论:
可以选择交换ScrollView
和ViewPager
吗?根据经验,我知道ScrollView
内的ViewPager
没有任何问题。因此,基本上不是将ViewPager
包裹在ScrollView
之内,而是将每个“页面”设为ScrollView
作为root。
很高兴听到这对你有用。
答案 1 :(得分:4)
MH。答案应该有效。
您的代码中的问题是ViewPager
与height
具有相同的ScrollView
,因此它不会滚动。 ViewPager
中的每个子视图也会与height
获得相同的ViewPager
。
尝试手动设置height
的{{1}} ViewPager
,它会滚动得很好......
但你真的应该使用MH答案:)
答案 2 :(得分:2)
我有samillar问题。以下是我如何解决它。
imageGrid.setOnTouchListener(new View.OnTouchListener() {
int dragthreshold = 30;
int downX;
int downY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) event.getRawX();
downY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int distanceX = Math.abs((int) event.getRawX() - downX);
int distanceY = Math.abs((int) event.getRawY() - downY);
if (distanceY > distanceX && distanceY > dragthreshold) {
imageGrid.getParent().requestDisallowInterceptTouchEvent(false);
parentScrollView.getParent().requestDisallowInterceptTouchEvent(true);
} else if (distanceX > distanceY && distanceX > dragthreshold) {
imageGrid.getParent().requestDisallowInterceptTouchEvent(true);
parentScrollView.getParent().requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
parentScrollView.getParent().requestDisallowInterceptTouchEvent(false);
imageGrid.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
return false;
}
});
值得一试。