Android:LinearLayout中的clipToPadding与子ListView被忽略?

Xeb*_*one 0 android listview fragment android-layout android-linearlayout

我有一个相当奇怪的问题,我希望有人能说清楚.我不确定它是否是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>
Run Code Online (Sandbox Code Playgroud)

即使我将clipToPadding设置为false,我的ListView仍然剪切到我的LinearLayout的填充!

一个解决办法是从LinearLayout中卸下顶部和底部填充,并将其添加到与clipToPadding设置为false上的ListView ListView的,但我宁愿没有这样做,作为一个特殊的情况,我可能要隐藏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>
Run Code Online (Sandbox Code Playgroud)

Simon Marquis的解决方案与我的解决方案相同.不是我想要的解决方案,因为现在我需要为我的LinearLayout的每个孩子添加额外的填充,但是一个解决方案,所以它是公认的答案.谢谢,西蒙的意见.

Sim*_*uis 5

ListView应该有clipToPadding属性而不是LinearLayout(并且它还应该包含padding而不是LinearLayout和scrollbarStyle ="outsideOverlay属性,以便滚动条可以放在应用程序的边缘).查看源代码以获取更多信息信息:

<ListView
    …
    android:clipToPadding="false"
    android:scrollbarStyle="outsideOverlay" />
Run Code Online (Sandbox Code Playgroud)

资源