Программная установка высоты LinearLayout внутри ScrollView не работает - PullRequest
0 голосов
/ 31 мая 2018

У меня есть ScrollView, чей уникальный ребенок - LinearLayout:

<ScrollView
    android:id="@+id/d_scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">
    <LinearLayout
        android:id="@+id/d_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/transparency"
        android:orientation="vertical"/>
</ScrollView>

Позже я динамически добавляю детей к LinearLayout, используя LayoutInflator (скажем, 5 детей в этомпример), и все они имеют вес 1 (так равных высот).Я хочу, чтобы только 4,5 ребенка были видны одновременно.Чтобы сделать это, я использовал метод post, чтобы изменить свойство layout_height LinearLayout, как только известна высота ScrollView:

if (n > visibleItems) { // here n = 5 and visibleItems = 4.5
    dScroll.setFillViewport(false);

    dScroll.post(() -> {
        int height = dScroll.getHeight();
        ViewGroup.LayoutParams lp = dLayout.getLayoutParams();
        lp.height = (int) Math.round(n * height / visibleItems);
        dLayout.setLayoutParams(lp);
    });
}

Однако, когда я делаюпри этом LinearLayout и его дочерние элементы ведут себя так, как если бы их высота была установлена ​​на wrap_content (что не так).При использовании инспектора макета в Android Studio обнаруживается, что layout_height для LinearLayout установлен на 1071 (правильное вычисленное значение), но метод getHeight() возвращает 578.

Я пыталсянесколько комбинаций requestLayout(), invalidate() и forceLayout(), но это ничего не изменило.

Сохранение свойства fillViewport для ScrollView в true заставляет LinearLayout принятьвысота ScrollView, поэтому в данном случае 964px вместо 1071, который я хочу.

Редактировать: проблема действительно в LinearLayout.Если я добавлю RelativeLayout между ScrollView и LinearLayout следующим образом:

<ScrollView
    android:id="@+id/d_scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">
    <RelativeLayout
        android:id="@+id/d_rel"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:id="@+id/d_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/transparency"
            android:orientation="vertical"/>
    </RelativeLayout>
</ScrollView>

и добавлю новую высоту вместо RelativeLayout:

if (n > visibleItems) { // here n = 5 and visibleItems = 4.5
    dScroll.setFillViewport(false);

    dScroll.post(() -> {
        int height = dScroll.getHeight();
        ViewGroup.LayoutParams lp = dRel.getLayoutParams();
        lp.height = (int) Math.round(n * height / visibleItems);
        dRel.setLayoutParams(lp);
    });
}

, тогдаRelativeLayout принимает правильную высоту (1071px), но LinearLayout в нем (то есть в match_parent height) по-прежнему всего 578px в высоту.

...