У меня есть 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 в высоту.