HorizontalScrollView 中添加 Fragment 的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
andev
V2EX    Android

HorizontalScrollView 中添加 Fragment 的问题

  •  
  •   andev 2018-08-08 11:10:04 +08:00 12528 次点击
    这是一个创建于 2692 天前的主题,其中的信息可能已经有所发展或是发生改变。
    HorizontalScrollView 的子 View 当做 container,在 Activiy 里 new 个 Fragment 放在 container。就这么简单功能,但是中间有问题。子 View 设置 match_parent 无效,Fragment 根布局也设置了 match_parent,但是 Fragment 的长宽还是按 Fragment 里面的子 View 显示了。之后 HorizontalScrollViews 设置了 anroid: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     Solana     2831 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 13:56 PVG 21:56 LAX 05:56 JFK 08:56
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86