V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
andev
V2EX  ›  Android

HorizontalScrollView 中添加 Fragment 的问题

  •  
  •   andev · 2018-08-08 11:10:04 +08:00 · 9070 次点击
    这是一个创建于 2300 天前的主题,其中的信息可能已经有所发展或是发生改变。
    HorizontalScrollView 的子 View 当做 container,在 Activiy 里 new 个 Fragment 放在 container。就这么简单功能,但是中间有问题。子 View 设置 match_parent 无效,Fragment 根布局也设置了 match_parent,但是 Fragment 的长宽还是按 Fragment 里面的子 View 显示了。之后 HorizontalScrollViews 设置了 android:fillViewport="true",这下 Fragment 可以占满屏幕了,但是 HorizontalScrollView 无法滑动了。请问这个问题怎么破?让 Fragment 能并行排列,又可以滑动。
    14 条回复    2018-08-09 09:22:06 +08:00
    StephenDev
        1
    StephenDev  
       2018-08-08 11:17:29 +08:00
    HorizontalScrollView 无法滑动,排查下是不是 HorizontalScrollView 设置了 match_parent 然后就是你的 Fragment 中的 View 将事件拦截了。
    andev
        2
    andev  
    OP
       2018-08-08 11:39:11 +08:00
    @StephenDev HorizontalScrollView 设置 wrap_content,Fragment 就被挤压成子 View 大小,比如 Fragment 只有一个 TextView,就算 TextView 的上面一层设置 match_parent,Fragment 被添加到 HorizontalScrollView 后,大小还是 TextView 一样,不会占整屏(match_parent)。
    Fragment 里的 View 就是一个 TextView,不会拦截事件
    StephenDev
        3
    StephenDev  
       2018-08-08 12:12:11 +08:00 via Android
    @andev 你的 fragment 里面就一个 TextView 的话,那你的整个 view 没有超过可显示区域,那肯定是不会滑动的。你是在 container 里面放了多个 fragment 吗。
    andev
        4
    andev  
    OP
       2018-08-08 13:15:31 +08:00
    @StephenDev TextView 只是 fragment 里的子 View,fragment 根 View 用的 match_parent,占满屏幕,但是实际跑,fragment 只有 TextView 的大小。HorizontalScrollView 的第一个子 View 下面有几个 container,每个 container 动态加 fragment。
    StephenDev
        5
    StephenDev  
       2018-08-08 14:13:19 +08:00
    @andev 根据我的实验来看,应该是你的「当前显示」 fragment 里面的内容一屏幕够显示了,所以导致无法滑动。哪怕是另外的 fragment 显示到了屏幕外面,scrollview 依然是不能滑动。你可以试下,在第一屏的 fragment 中,让 textview 的内容尽可能多,然后就可以滑动了。
    andev
        6
    andev  
    OP
       2018-08-08 16:35:59 +08:00
    @StephenDev 直接贴代码吧
    <HorizontalScrollView
    android:id="@+id/horizontalScrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    >

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <LinearLayout
    android:id="@+id/left"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"/>

    <LinearLayout
    android:id="@+id/right"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"/>

    </LinearLayout>
    </HorizontalScrollView>

    left 和 right 都是根 match_parent 的 Fragment,之后 add 进来。无法滑动
    StephenDev
        7
    StephenDev  
       2018-08-08 16:45:26 +08:00
    @andev 是的,我也是这样的,根源问题就是你 left 布局添加进来的 fragment 中的内容是可以一屏显示的。你试试把 left 布局中的 fragment 里面的内容超出水平方向,然后你再试试。
    andev
        8
    andev  
    OP
       2018-08-08 17:00:56 +08:00
    @StephenDev 想搞成 ViewPager 分屏的效果,超出一屏就算能滑也没意义。就是不知道为什么现在这种情况不能滑动。
    StephenDev
        9
    StephenDev  
       2018-08-08 17:03:34 +08:00
    @andev 如果你想搞成 Viewpager 那种效果的话,可以直接用 Viewpager 啊,或者使用 recyclerview,相当于每个 fragment 就是一个 item。
    现在不能滑动的根本原因就是你的内容一屏能显示了,所以就「滑无可滑」、
    andev
        10
    andev  
    OP
       2018-08-08 17:24:32 +08:00
    @StephenDev 之前一直用 ViewPager,想换 HorizontalScrollView,然后自己写一些逻辑,一屏只能占 left 的 fragment,还有并行的 right fragment,并不是一屏能显示
    StephenDev
        11
    StephenDev  
       2018-08-08 17:30:52 +08:00
    @andev 老哥你还是没太懂我的意思。我的意思是因为你的 Left-Fragment 中的内容是能够一屏显示的,和你的 right-fragment 没关系。无论你的 right-fragment 能不能一屏显示,或者无论你总共有多少个 fragment。
    但是你的第一屏的 left-fragment 中的内容能够一屏显示,那么就不会滑动。
    我测试的时候就是在 scrollview 中放了很多个 textview,只有在第一个 textview 的内容不能一屏显示的时候,整个 scrollview 才能够滑动。
    如果我的第一个 textview 的内容一屏能够显示完毕,那么哪怕我后面还有无数个 textview 不能显示在屏幕上。scrollview 也照样是不能滑动的。
    所以根源你问题就是你的第一个布局中的内容是否超出屏幕。
    Deffi
        12
    Deffi  
       2018-08-08 17:35:25 +08:00
    HorizontalScrollView 布局下仅能设置一个 ViewGroup,ViewGroup layout_width 只能设为 wrap_content

    每个 fragment 的 root view layout_width 需设定具体值才能满足你的需求
    andev
        13
    andev  
    OP
       2018-08-08 21:17:48 +08:00
    @StephenDev 看来要自定义个 ViewGroup 了, HorizontalScrollView 太坑
    icop
        14
    icop  
       2018-08-09 09:22:06 +08:00
    HorizontalScrollView 下面只能又一个 viewGroup,而且这个 viewGroup 的高度要么是 -2,要么是准确值。
    可以自定义这个 viewGroup,并且在其 onMeasure 方法中,重新用 Measure.makeMeasureSpec 重新计算其准确的高度。

    scrollview 和内部的滑动事件冲突,重写 其 onInterceptTouchEvent,该方法用户拦截被传递过来的事件,用于判断被传递过来的事件是否需要被当前的 view 进行处理。顺带的,你了解下 onTouchEvent,和 dispatchTouchEvent,然后你就能处理任何因滑动事件冲突问题了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2897 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 08:56 · PVG 16:56 · LAX 00:56 · JFK 03:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.