HorizontalScrollView 中添加 Fragment 的问题

2018-08-08 11:10:04 +08:00
 andev
HorizontalScrollView 的子 View 当做 container,在 Activiy 里 new 个 Fragment 放在 container。就这么简单功能,但是中间有问题。子 View 设置 match_parent 无效,Fragment 根布局也设置了 match_parent,但是 Fragment 的长宽还是按 Fragment 里面的子 View 显示了。之后 HorizontalScrollViews 设置了 android:fillViewport="true",这下 Fragment 可以占满屏幕了,但是 HorizontalScrollView 无法滑动了。请问这个问题怎么破?让 Fragment 能并行排列,又可以滑动。
5031 次点击
所在节点    Android
14 条回复
StephenDev
2018-08-08 11:17:29 +08:00
HorizontalScrollView 无法滑动,排查下是不是 HorizontalScrollView 设置了 match_parent 然后就是你的 Fragment 中的 View 将事件拦截了。
andev
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
2018-08-08 12:12:11 +08:00
@andev 你的 fragment 里面就一个 TextView 的话,那你的整个 view 没有超过可显示区域,那肯定是不会滑动的。你是在 container 里面放了多个 fragment 吗。
andev
2018-08-08 13:15:31 +08:00
@StephenDev TextView 只是 fragment 里的子 View,fragment 根 View 用的 match_parent,占满屏幕,但是实际跑,fragment 只有 TextView 的大小。HorizontalScrollView 的第一个子 View 下面有几个 container,每个 container 动态加 fragment。
StephenDev
2018-08-08 14:13:19 +08:00
@andev 根据我的实验来看,应该是你的「当前显示」 fragment 里面的内容一屏幕够显示了,所以导致无法滑动。哪怕是另外的 fragment 显示到了屏幕外面,scrollview 依然是不能滑动。你可以试下,在第一屏的 fragment 中,让 textview 的内容尽可能多,然后就可以滑动了。
andev
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
2018-08-08 16:45:26 +08:00
@andev 是的,我也是这样的,根源问题就是你 left 布局添加进来的 fragment 中的内容是可以一屏显示的。你试试把 left 布局中的 fragment 里面的内容超出水平方向,然后你再试试。
andev
2018-08-08 17:00:56 +08:00
@StephenDev 想搞成 ViewPager 分屏的效果,超出一屏就算能滑也没意义。就是不知道为什么现在这种情况不能滑动。
StephenDev
2018-08-08 17:03:34 +08:00
@andev 如果你想搞成 Viewpager 那种效果的话,可以直接用 Viewpager 啊,或者使用 recyclerview,相当于每个 fragment 就是一个 item。
现在不能滑动的根本原因就是你的内容一屏能显示了,所以就「滑无可滑」、
andev
2018-08-08 17:24:32 +08:00
@StephenDev 之前一直用 ViewPager,想换 HorizontalScrollView,然后自己写一些逻辑,一屏只能占 left 的 fragment,还有并行的 right fragment,并不是一屏能显示
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
2018-08-08 17:35:25 +08:00
HorizontalScrollView 布局下仅能设置一个 ViewGroup,ViewGroup layout_width 只能设为 wrap_content

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

scrollview 和内部的滑动事件冲突,重写 其 onInterceptTouchEvent,该方法用户拦截被传递过来的事件,用于判断被传递过来的事件是否需要被当前的 view 进行处理。顺带的,你了解下 onTouchEvent,和 dispatchTouchEvent,然后你就能处理任何因滑动事件冲突问题了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/477867

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX