以编程方式设置ScrollView中的LinearLayout高度不起作用

时间:2018-05-31 14:21:21

标签: android android-layout android-linearlayout android-scrollview

我有一个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。

我尝试了LinearLayoutgetHeight()requestLayout()的多种组合,但它没有改变任何内容。

invalidate()的{​​{1}}属性保留为forceLayout()会使fillViewport占据ScrollView的高度,因此在这种情况下,964px代替1071我想要的。

编辑:问题确实来自true。如果我在LinearLayoutScrollView之间添加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),但其中的RelativeLayoutif (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高。

0 个答案:

没有答案