Почему мой 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 несколько строк в compose_message_body чтобы пользовательский интерфейс compose_message_body ниже нижней части экрана, правый край пользовательского интерфейса входит туда, где он принадлежит. Смотрите скриншоты ниже.

LinearLayout является коротким и не вызывает прокрутку ScrollView - по какой-то причине он слишком широкLinearLayout длинный и вызывает прокрутку ScrollView - и теперь он имеет идеальную ширину

Любые идеи относительно того, что здесь происходит?

Это побочный эффект использования атрибута fillViewPort в вашем ScrollView. Если вы установили fillViewPort в значение true, это будет учтено только в том случае, если измеренная высота вашего ребенка ниже высоты вашего ScrollView. В этом случае ScrollView растянет содержимое, чтобы заполнить область просмотра, и ваши поля не будут применены правильно. Как только содержимое вашего ребенка будет больше, чем высота вашего ScrollView, ваши поля будут применены правильно.

Я предлагаю не использовать поля на дочернем макете (LinearLayout), которые вы разместили в ScrollView, но только для заполнения.

Таким образом, ваш стиль Контейнера может стать

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

В стилях ваш контейнер имеет маржу, оставленную на 130dp. Так сильно нажмите на весь макет. Если вы установите его на 0dp, он должен находиться в правильном положении.

Intereting Posts
Как рисовать растровое изображение в верхней правой части холста Предварительный просмотр камеры с помощью двойного пальца Разделение больших классов на внутренние классы в Java Экспорт проекта Android при использовании proguard на adt & sdk 20 Могу ли я отключить кнопку и все еще слушать клики? Как избежать сбоя createBitmap () в android Применение плагина «kotlin-android» в мгновенном приложении приводит к тому, что «null не может быть применено к ненулевому типу com.android.build.gradleBasePlugin» Как скачать изображение быстрее в android Volley / Picasso / Glide любой другой? SQLiteDatabase.insert () возвращает неверный rowid для виртуальных таблиц Как запретить Android возвращать кешированный ответ на мой HTTP-запрос? Альтернатива openintents для имитации датчиков для Android Обработка onNewIntent для FLAG_ACTIVITY_NEW_TASK Проблема с записью внутренней памяти android Как имитировать вращение устройства с помощью эмулятора Android? Как закрепить файл с паролем (AES) для iOS и Android?