Прокручиваемый linearlayout с весами больше, чем экран в android

Я пытаюсь создать вертикальный linearlayout с весами, размер которых больше экрана. Позвольте сказать 2x размер экрана. Для этого я, очевидно, должен был бы прокрутить это. К сожалению, я не могу понять, как это сделать. Я попытался использовать вес макета и установил весовую сумму как половину фактической суммы весов всех компонентов (поэтому, если все весы компонентов составляют 20, я установил весовую сумму как 10) и сумел заставить ее работать, но, к сожалению, по какой-то причине прокрутка больше не работает.

Есть ли что-то, что мне не хватает?

это код, который делает linearlayout вдвое большим, чем экран, но прокрутка не работает:

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

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:weightSum="2">

        <EditText android:id="@+id/id1"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:textSize="25dp"
            android:gravity="center"
            android:layout_weight="2"/>

        <EditText android:id="@+id/id2"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:textSize="25dp"
            android:gravity="center"
            android:layout_weight="2"/>

    </LinearLayout>
</ScrollView>

Ответ 1

Основываясь на вашем комментарии, вот программный способ достижения того, что вы ищете. Я не верю, что есть способ сделать это в чистом формате XML.

Разметка:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:background="#000000"
    android:fillViewport="true" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/id1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#DCDCDC"
            android:gravity="center"
            android:text="ONE ONE ONE"
            android:textIsSelectable="false"
            android:textSize="45sp" />

        <EditText
            android:id="@+id/id2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#AAAAAA"
            android:gravity="center"
            android:text="TWO TWO TWO"
            android:textIsSelectable="false"
            android:textSize="45sp" />

        <EditText
            android:id="@+id/id3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#777777"
            android:gravity="center"
            android:text="THREE THREE THREE"
            android:textIsSelectable="false"
            android:textSize="45sp" />
    </LinearLayout>

</ScrollView>

Активность:

public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      // Get display size -- API L13 and up. Otherwise use getResources().getDisplayMetrics();
      Display display = getWindowManager().getDefaultDisplay();
      Point size = new Point();
      display.getSize(size);


      // You want size to be 50% per EditText, so divide available height by 2.
      // Note: this is absolute height, does not take into consideration window decoration!
      int editTextHeight = size.y / 2;

      // Get a handle to your EditTexts
      EditText t1 = (EditText) findViewById(R.id.id1);
      EditText t2 = (EditText) findViewById(R.id.id2);
      EditText t3 = (EditText) findViewById(R.id.id3);

      // Set height to 50% of screen size each
      t1.setHeight(editTextHeight);
      t2.setHeight(editTextHeight);
      t3.setHeight(editTextHeight);
}

Это будет сделано. Конечный результат:

EditText 50% screen heightEditText 50% screen heightEditText 50% screen height

Ответ 2

Вы указали высоту вашего LinearLayout "match_parent", равную высоте его родителей. Он никогда не будет прокручиваться, пока контент больше, чем ScrollView. Прежде всего, вы должны указывать фиксированную высоту (50dp) или wrap_content, или вы должны установить ее высоту программно (например, 2 экрана высоты экрана, как вы упоминаете).

weightSum и weight всегда будут заставлять ваши элементы соответствовать вашему текущему размеру LinearLayouts, поэтому постарайтесь не использовать его.

Надеюсь, это поможет.

Ответ 3

Проблема заключается в том, что использование layout_weight и weightSum недопустимо. Важно помнить, что android:layout_weight может использовать только оставшееся свободное пространство в представлении; все, что превышает эту границу, автоматически обрезается.

Поэтому в вашем примере ваш первый EditText занимает весь экран, а ваш второй полностью исключается из представления. Поскольку второй EditText обрезается, LinearLayout отображает весь экран и ничего не делает для ScrollView.

Я не совсем уверен, какова ваша конечная цель; пытаетесь ли вы вставлять текстовые входы с записью пользователя, а ScrollView обрабатывает переполнение?

Если это так, это будет работать:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:background="#000000"
    android:fillViewport="true" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:orientation="vertical" >

        <EditText
        android:id="@+id/id1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#DCDCDC"
        android:gravity="center"
        android:text="ONE ONE ONE"
        android:textIsSelectable="false"
        android:textSize="45sp" />

    <EditText
        android:id="@+id/id2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#AAAAAA"
        android:gravity="center"
        android:text="TWO TWO TWO"
        android:textIsSelectable="false"
        android:textSize="45sp" />
    </LinearLayout>

</ScrollView>

Я включил некоторые базовые цвета фона, чтобы вы могли видеть, где каждый элемент начинается и заканчивается предварительным просмотром макета. Ввод в первом EditText будет правильно сдвигать второй, создавая полосу прокрутки.

Также обратите внимание, что вместо dp для textSize следует использовать sp.

Изменить: я должен также отметить, что для пояснения, что weightSum также будет забирать место, когда это необходимо. Чтобы проверить это, установите weightSum вашего LinearLayout в 2, а затем добавьте android:layout_weight="1" в каждый из элементов управления EditText. Конечным результатом будет раскол 50/50 при загрузке представления, а затем, когда вы начнете вводить первый элемент управления, второе пространство будет уменьшаться соответственно. Добавление текста во второй элемент управления приведет к появлению полосы прокрутки.