【发布时间】:2014-08-11 16:14:30
【问题描述】:
我有一个相当奇怪的问题,希望有人能解释一下。我不确定这是否是 Android 错误。
我在片段中显示了以下布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@color/grey"
android:orientation="vertical"
tools:context="com.testapp.test.TestFragment"
>
<ListView
android:id="@+id/data_listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</ListView>
<TextView
android:id="@+id/section_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
即使我已将 clipToPadding 设置为 false,我的 ListView 仍会剪切到我的 LinearLayout 的填充!
解决方法是从 LinearLayout 中删除顶部和底部填充并将其添加到 ListView 中,并将 ListView 上的 clipToPadding 设置为 false,但我宁愿不这样做,因为在特殊情况下,我可能想要隐藏 ListView 以显示,例如,它下方(和屏幕外)的 TextView,同时保持填充,并希望避免在布局中增加额外的复杂性。
更新: 通过一些测试,我发现了一些有趣的东西。在父 LinearLayout 上设置 clipToPadding 无效,因为 ListView 本身不会在父 LinearLayout 内滚动,而是在 ListView 内的子项在 ListView 内滚动!在使用调试工具进行一些调查之后,现在看起来很明显。子项被限制在 ListView 本身内部的空间内,并且由于 ListView 设置在 LinearLayout 的填充内,并且不会移动,因此子项会在该空间内滚动。
这是我画的 ASCII 图:
--------- <LinearLayout>
| |
| | [ Padding ]
| |
| ----- | <ListView>
| | c | |
| | o | |
| | n | | Content scrolls
| | t | | within ListView
| | e | | ListView doesn't move
| | n | |
| | t | |
| ----- | </ListView>
| |
| | [ Padding ]
| |
--------- </LinearLayout>
Simon Marquis 的解决方案与我的解决方法相同。不是我想要使用的解决方案,因为现在我需要为我的 LinearLayout 的每个孩子添加额外的填充,而是一个解决方案,所以它是公认的答案。谢谢 Simon 的意见。
【问题讨论】:
标签: android android-layout listview fragment android-linearlayout