在纯XML中,我创建了一个需要滚动的东西列表。我有一个LinearLayout
加权和为3,它包含四个项目。 LinearLayout
内的所有项目总共占父母身高的133%。
修剪示例:
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:weightSum="3">
<RelativeLayout android:layout_weight="1" />
<RelativeLayout android:layout_weight="1" />
<RelativeLayout android:layout_weight="1" />
<RelativeLayout android:layout_weight="1" />
</LinearLayout>
如何使用ScrollView
将最后一项放入视图?简单地将LinearLayout
包裹在滚动条中会导致布局失去其高度的所有概念,导致其子项的高度为wrap_content
,而不是拉伸。
答案 0 :(得分:1)
除非你可以简单地为四个内部视图中的每一个提供一个恒定的高度(而不是使用重量),否则我不相信有任何方法可以做任何你想做的事情而无需借助Java代码调整内部视图的高度。这种信念基于两个概念:
首先,为了滚动,ScrollView
的内容必须高于ScrollView
本身。这意味着您无法在android:layout_height="match_parent"
上使用LinearLayout
并且也可以滚动。
其次,layout_weight
仅在子视图中分配多余空间。换句话说,此属性仅在子视图&#39;固有尺寸小于父母尺寸。这意味着您无法在android:layout_height="wrap_content"
上使用LinearLayout
,也可以获得加权的身高分布。
这使得设置恒定高度成为唯一的选择。
如果您可以使用Java代码动态更新子视图的高度,那么这里有一个模板:
<强>布局强>:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:id="@+id/one"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#caf"/>
<View
android:id="@+id/two"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#fff"/>
<View
android:id="@+id/three"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#fca"/>
<View
android:id="@+id/four"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#afc"/>
</LinearLayout>
</ScrollView>
<强>爪哇:强>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View scrollingParent = findViewById(R.id.scroll);
scrollingParent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int childHeight = scrollingParent.getHeight() / 3;
setHeight(R.id.one, childHeight);
setHeight(R.id.two, childHeight);
setHeight(R.id.three, childHeight);
setHeight(R.id.four, childHeight);
}
});
}
private void setHeight(int viewId, int height) {
View v = findViewById(viewId);
ViewGroup.LayoutParams params = v.getLayoutParams();
params.height = height;
v.setLayoutParams(params);
}
ViewTreeObserver.OnGlobalLayoutListener
类和关联的addOnGlobalLayoutListener()
调用将一直等到系统实际测量并布置滚动父级,以便在调用{{{{{{{{{{{{ 1}}。然后,您只需更新每个子视图的scrollingParent.getHeight()
即可获得所需的高度。