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

时间:2014-04-29 14:06:12

标签: android android-layout scrollview

我有一个活动布局文件:

<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>

相关样式如下:

<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>

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

LinearLayout is short and does not cause ScrollView to scroll - for some reason it's too wide LinearLayout is long and causes ScrollView to scroll - and now it has perfect width

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

在样式中,容器的边距为130dp。将整个布局推向右侧。如果将其设置为0dp,则应该处于正确的位置。