【问题标题】:Android: clipToPadding in LinearLayout with child ListView ignored?Android:LinearLayout中的clipToPadding忽略了子ListView?
【发布时间】: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


    【解决方案1】:

    ListView 应该具有 clipToPadding 属性而不是 LinearLayout(它还应该包含 padding 而不是具有 scrollbarStyle="outsideOverlay 属性的 LinearLayout,以便滚动条可以放置在应用程序的边缘)。请参阅更多信息来源:

    <ListView
        …
        android:clipToPadding="false"
        android:scrollbarStyle="outsideOverlay" />
    

    Source

    【讨论】:

    • 不,抱歉。如前所述,我已经尝试设置 listView 和 LinearLayout 的 clipToPadding 属性。
    • 嗯,实际上,它在与 ListView 一起使用时非常有效。官方示例代码,我已经试过很多次了。
    • 据我了解,您希望我从 LinearLayout 中删除填充,然后将其放入 ListView 中,就像我的解决方法一样?是的,这确实有效......但这是一种解决方法。这意味着我也需要在 ProgressBar 中添加填充以获得所需的外观,这会在不需要存在的布局中增加额外的复杂性,因为 ClipToPadding 属性在 LinearLayout 中工作
    • 当然,但是,您可以将 ProgressBar 和 TextView 包装在具有填充的容器中。
    • 确实如此......但它仍然是一种解决方法。它可以解决 clipToPadding 在父 LinearLayout 中无法正常工作的问题。我正在寻找一种解决问题的方法,找到一个解决方案而不会在解决方法中增加额外的复杂性,或者确认确实存在错误。也许它不起作用是因为我忽略了一些小东西。无论如何,感谢您的建议。
    猜你喜欢
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2013-10-09
    相关资源
    最近更新 更多