为什么我的ScrollView只在不需要滚动时太宽?

Aar*_*ron 3 android scrollview android-layout

我有一个活动布局文件:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/compose_message_view"
        style="@style/Container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <LinearLayout style="@style/SectionContainer" >

            <TextView
                style="@style/FieldHeader"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawablePadding="8dp"
                android:focusable="true"
                android:focusableInTouchMode="true" />

            <Spinner
                android:id="@+id/compose_message_department"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingBottom="8dp"
                android:prompt="@string/compose_message_department_prompt"
                android:spinnerMode="dropdown" />
        </LinearLayout>

        <LinearLayout style="@style/SectionContainer" >

            <TextView
                style="@style/FieldHeader"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:drawablePadding="8dp"
                android:text="@string/message_account_label" />

            <Spinner
                android:id="@+id/compose_message_account"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingBottom="8dp"
                android:prompt="@string/compose_message_account_prompt"
                android:spinnerMode="dropdown" />
        </LinearLayout>

        <EditText
            android:id="@+id/compose_message_subject"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="32dp"
            android:layout_marginTop="16dp"
            android:hint="@string/compose_message_subject_hint"
            android:inputType="textCapSentences" />

        <EditText
            android:id="@+id/compose_message_body"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/compose_message_body_hint"
            android:inputType="textMultiLine|textCapSentences" />
    </LinearLayout>

</ScrollView>
Run Code Online (Sandbox Code Playgroud)

相关样式如下所示:

<style name="Container">
    <item name="android:layout_marginRight">130dp</item>
    <item name="android:layout_marginLeft">130dp</item>
    <item name="android:paddingTop">32dp</item>
    <item name="android:paddingLeft">32dp</item>
    <item name="android:paddingRight">32dp</item>
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:orientation">vertical</item>
</style>

<style name="SectionContainer">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:orientation">vertical</item>
    <item name="android:paddingBottom">16dp</item>
</style>

<style name="FieldHeader" parent="android:Widget.TextView">
    <item name="android:textAllCaps">true</item>
    <item name="android:paddingLeft">12dp</item>
    <item name="android:paddingTop">24dp</item>
    <item name="android:paddingRight">12dp</item>
</style>
Run Code Online (Sandbox Code Playgroud)

现在,当我在Nexus 7的横向上打开此活动时(还没有尝试过其他平板电脑),ScrollView及其内容超出了屏幕的右边缘.当我在compose_message_bodyEditText中键入几行以便UI延伸到屏幕底部以下时,UI的右边缘会进入它所属的位置.请参阅下面的截图.

LinearLayout很短,不会导致ScrollView滚动 - 由于某种原因它太宽了 LinearLayout很长并导致ScrollView滚动 - 现在它具有完美的宽度

关于这里发生了什么的任何想法?

小智 6

这是在ScrollView上使用fillViewPort属性的副作用.如果您已将fillViewPort设置为true,那么只有在您的孩子的测量高度低于ScrollView的高度时才会考虑这一点.在这种情况下,ScrollView将拉伸内容以填充视口,并且您的边距将无法正确应用.只要您孩子的内容大于ScrollView的高度,您的边距就会正确应用.

我建议不要在您放置在ScrollView中的子布局(LinearLayout)上使用边距,而只使用填充.

所以你的容器风格可能会变成

<style name="Container">
    <item name="android:paddingTop">32dp</item>
    <item name="android:paddingLeft">164dp</item>
    <item name="android:paddingRight">164dp</item>
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:orientation">vertical</item>
</style>
Run Code Online (Sandbox Code Playgroud)