我有一个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
(在本例中假设5个孩子)动态地将孩子添加到LayoutInflator
,并且他们的权重均为1(如此相等的高度)。我希望一次只能看到4.5个孩子。为此,我使用post
方法在layout_height
的高度已知时更改LinearLayout
的{{1}}属性:
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
(事实并非如此)。在Android Studio中使用布局检查器时,我发现wrap_content
的{{1}}设置为1071(正确的计算值),但layout_height
方法返回578。
我尝试了LinearLayout
,getHeight()
和requestLayout()
的多种组合,但它没有改变任何内容。
将invalidate()
的{{1}}属性保留为forceLayout()
会使fillViewport
占据ScrollView
的高度,因此在这种情况下,964px代替1071我想要的。
编辑:问题确实来自true
。如果我在LinearLayout
和ScrollView
之间添加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>
采用正确的高度(1071px),但其中的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);
});
}
高度)仍然只有578px高。