Высота экрана Android ScrollView для отображаемого содержимого

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

Предположим, что у меня есть прокрутка с линейной компоновкой внутри нее, я хочу, чтобы это сказало, высота 250dp на экране при макс и независимо прокручивается, когда заполнено большим количеством записей, чем может помещаться в пространство 250dp.

У меня теперь есть:

<ScrollView
    android:minWidth="25px"
    android:minHeight="150px"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/XXXXXXX"
    android:scrollbars="vertical">

    <LinearLayout
        android:orientation="vertical"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/XXXXXX" />
</ScrollView>

Когда заполняется, scrollview и linearlayout просто растягиваются до тех пор, пока они должны соответствовать содержимому и отображать все его, вместо того, чтобы иметь "окно" 250dp/px (любое измерение было бы неплохо) с содержимым, прокручиваемым внутри него.

Я новичок в платформе Android, поэтому, возможно, ответ очевиден, и я просто не понял язык, но любая помощь будет принята с благодарностью! Спасибо

--- SOLVED: Поместите линейный выход за пределы ScrollView с высотой.

Ответ 1

Вам нужно maxHeight. Но поскольку представления не поддерживают его, вы должны использовать обходной путь.

Проверьте этот ответ:

fooobar.com/questions/44903/...

Ответ 2

С некоторой помощью из этого ответа мне удалось обернуть очень простой компонент ScrollView, который вы можете использовать для этого случая:

Создайте собственный класс, расширяющий ScrollView, и внесите следующие изменения:

public class MaxHeightScrollView extends ScrollView {

    private int maxHeight;

    public MaxHeightScrollView(Context context) {
        super(context);
    }

    public MaxHeightScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        if (attrs != null) {
            TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
            maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, 200); //200 is a default value
            styledAttrs.recycle();
        }
    }

   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
       super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   }
}

И еще одна небольшая вещь - это объявить ваш стиль в файле attrs.xml вашей папки значений (если у вас его нет, просто создайте файл XML с этим именем в папке значений в папке res вашего проекта). Добавьте туда следующие строки:

<declare-styleable name="MaxHeightScrollView">
    <attr name="maxHeight" format="dimension" />
</declare-styleable>

И используйте ваш новый ScrollView следующим образом:

<com.yourpackage.MaxHeightScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:maxHeight="300dp">
</com.yourpackage.MaxHeightScrollView>

Кредиты идут на Whizzle для быстро оборачивать это!

Ответ 3

Мое простое решение.
Установите ScrollView heigh в xml:

android:layout_height="wrap_content"

Добавьте этот код, чтобы установить максимальную высоту в 200, если текущая измеренная высотa > 200

sv.measure(0, 0);
if (nsv.getMeasuredHeight() > 200) {
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                                      ViewGroup.LayoutParams.MATCH_PARENT, 200);
        sv.setLayoutParams(lp);
}

ScrollView в моем примере находится в LinearLayout, поэтому я использовал LinearLayout.LayoutParams.

Ответ 4

Если я не ошибаюсь, высота ViewGroup (высота LinearLayout в вашем случае), то есть (только) дочерний элемент внутри ScrollView, всегда интерпретируется как wrap_content, поскольку это содержимое может быть больше высоты ScrollView (следовательно, полосы прокрутки).

Это также означает, что если содержимое меньше, содержимое ScrollView (дочерний элемент) может не обязательно растягиваться, чтобы заполнить экран.

Чтобы визуально помочь вам исправить это, мы должны увидеть скриншот вашей проблемы.

Возможно, настройка android:fillViewport="true" в ScrollView исправит вашу проблему:

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

Ответ 5

Добавьте макет вокруг вашего ScrollView с фиксированной высотой