我有一个"页面",其上有许多组件,其内容的长度超过了设备的高度.好吧,只需将所有布局(整个页面)放在里面ScrollView,没问题.
其中一个组件是ViewPager.这可以正确呈现,但是对滑动/拖动的响应没有正确执行,它是紧张的,并不总是有效.它似乎与'混淆' ScrollView,所以当你在一条精确的水平线上投掷时,只能100%工作.
如果我删除了ScrollView,ViewPager会完美响应.
我有一个搜索,并没有发现这是一个已知的缺陷.还有其他人经历过这个吗?
下面是一些示例代码供您测试,注释掉ScrollView以查看它是否正常工作.
活动:
package com.ss.activities;
import com.ss.R;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.TextView;
public class PagerInsideScollViewActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewPager vp = (ViewPager) findViewById(R.id.viewpager);
vp.setAdapter(new MyPagerAdapter(this));
}
}
class MyPagerAdapter extends PagerAdapter {
private Context ctx;
public MyPagerAdapter(Context context) {
ctx = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Google地图放在滚动视图中,以便用户可以向下滚动其他内容以查看地图.问题是这个滚动视图占用了所有垂直触摸事件,因此地图的UI体验变得非常奇怪.
我知道在谷歌地图的V1中,您可以覆盖onTouch或setOnTouchListener以在MotionEvent.ACTION_DOWN上调用requestDisallowInterceptTouchEvent.我试图用V2实现类似的技巧无济于事.
到目前为止,我尝试过:
这些都没有解决滚动问题.我在这里错过了什么吗?如果有人在滚动视图中有一个地图的工作示例,请您分享代码示例吗?
编辑:看看我自己的答案,以便于解决
重要提示:Bounty提供了明确的方式来修改ViewPager以满足下面概述的方案.请不要提供HorizontalScrollView - 我需要覆盖完整的Fragment生命周期场景
我需要实现Fragments基于视图的水平滚动,其中一个项目位于中心,右侧/左侧的项目部分或完全可见.ViewPager不适合这项任务,因为它专注于每次显示一个项目.
为了便于理解,下面是一个快速草图,其中第1项,第5项和第6项位于可视区域之外.并且想要使这个可查看的数字可配置,例如在纵向视图中,我将只显示2个(或可能只是一个)项目.
我不打算在屏幕上说出3个项目,只要显示中心项目,其他项目就可以被裁剪.在小屏幕上可以有1个中心项目,并且当屏幕增大时,应显示多个(裁剪为OK)项目
我知道这看起来像一个画廊但是这些项目不是简单的图像,而是Fragments在每个片段中都有一个可垂直滚动的列表
PS找到了@Commonsware的这篇博文,其中列出了3种不同的方法.根据我的需要,我喜欢#3

我正在尝试使用包含ScrollViews的ViewFlipper创建布局.我们的想法是检测水平滑动以移动到上一个/下一个ScrollView.此外,ScrollView包含另一个ViewFlipper,其中包含带有垂直滑动检测器的ImageView,可以转到上一个/下一个ImageView.当我用LinearLayout替换ScrollView时,两个手势检测器都能正常工作,但是使用ScrollView时,没有任何工作(手势监听器甚至不是触发器).为什么使用ScrollView会禁用我的手势检测器?我怎样才能使它工作?
活动
public class ProduitHome extends Activity{
private Resources res;
float density;
private int position, parent_id;;
private int num_products;
private Produit produit;
private ImageDownloader mImageLoader;
private ViewFlipper product_viewflipper;
private ScrollView current_product_layout;
Animation next_product_out, next_product_in, previous_product_in, previous_product_out;
private GestureDetector galleryGestureDetector;
private View.OnTouchListener galleryGestureListener;
private GestureDetector productGestureDetector;
private View.OnTouchListener productGestureListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.produit_home);
num_products = GlobalData.map_list_produits.get(parent_id).size();
product_viewflipper = (ViewFlipper) findViewById(R.id.product_viewflipper);
LayoutInflater inflater = getLayoutInflater();
// Add num_products view to the viewflipper
for(int i=0; i<num_products; i++){
ScrollView product_detail …Run Code Online (Sandbox Code Playgroud) 我有一个HorizontalScrollView内心ViewPager.我requestDisallowInterceptTouchEvent(true);为此设定
了HorizontalScrollView但ViewPager仍有时会拦截触摸事件.是否有另一个命令我可以用来阻止View的父级和祖先拦截触摸事件?
注意:HorizontalScrollView只占屏幕的一半.
我需要有一个ViewPager内部a ScrollView但是ViewPager当它进入时不会出现ScrollView,当我不使用时一切都好ScrollView.
我已经在stackoverflow或其他网站上看到过这样的问题,所有这些问题都得到了解答,你必须把它们放到android:fillViewport="true"你的滚动视图来修复问题,但是这个解决方案对我来说ViewPager不起作用,仍然没有出现即使我有android:fillViewport="true"我的ScrollView.
我想在android api中有些东西发生了变化,这个解决方案不再适用了,有没有人知道我怎么可能ViewPager出现在一个ScrollView?
更新:一个有效的ScrollView布局XML:
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/itemsViewPager2"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</android.support.v4.view.ViewPager>
</LinearLayout>
</ScrollView>
Run Code Online (Sandbox Code Playgroud) 我正在构建一个Android Wear应用程序,我希望将其作为几个可以横向滑动的页面呈现.
为此,我使用GridViewPager和相关联的FragmentGridPagerAdapter,它使用单行进行硬连线.这适用于在瓷砖之间水平滑动,但是在我的一个片段中,我想使用WearableListView来允许用户在多个动作之间进行选择.不幸的是,这不起作用,因为看起来GridViewPager阻止任何滑动到达WearableListView.有没有人知道是否有办法可以使用描述的组件完成?
我也尝试过使用标准的ViewPager,这样可以让WearableListView滚动得很好,但是水平滑动变得很好,你经常需要滑动几次才能移动视图寻呼机.
我在ScrollView中有多个HorizontalScrollViews.水平滚动根本不平滑.我必须水平滚动几乎完全滚动才能工作.是否有一个简单的修复来调整这个??? 谢谢!

所以,我有ScrollView一个孩子 - 一个LinearLayout有两个孩子:a TextView和a ViewPager.ViewPager包含许多元素的布局,这就是为什么我需要垂直滚动的能力.只有页面ViewPager可以水平滚动(即:我只想在其中水平滑动ViewPager).那一个TextView不能水平滚动,但应该与我一起滚动ViewPager.
简单?没有.
我在StackOverflow中看到了非常类似的问题(这里,这里,这里和这里).所有建议的解决方案都不适合我:(
我看到的是这个 < - 我的甜蜜UI :),但我无法垂直滚动:(
在ViewPager中嵌入ScrollViews不是一个选项 - UI的设计禁止这样做.
也许这是我用编程方式填充视图寻呼机中的每个页面的东西?嗯...
任何建议,将不胜感激.
我的代码:
activity_main.xml中:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/white"
android:fillViewport="true" >
<LinearLayout
android:id="@+id/linearLayoutGeneral"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tvText"
android:layout_width="fill_parent"
android:layout_height="200dp"
android:text="Test text" />
<android.support.v4.view.ViewPager
android:id="@+android:id/viewpager"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</android.support.v4.view.ViewPager>
</LinearLayout>
</ScrollView>
Run Code Online (Sandbox Code Playgroud)
ViewPager中的每个页面都有这样的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content" …Run Code Online (Sandbox Code Playgroud) android android-fragments android-scrollview android-viewpager