以下是我希望ScrollView的样子:
layout_height="wrap_content"
以下是我目前的情况:
<ScrollView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:measureAllChildren="true"
android:fillViewport="false"
>
我认为measureAllChildren
确实没有做任何事情......
如果我添加android:layout_weight
,大小将永远是我想要的最大值。没有它,它只会扩展到它应该... ...
我不介意扩展ScrollView类来改变onMeasure的行为,如果我需要......?
PS:如果这有所不同,我试图让这个从Froyo开始工作。答案 0 :(得分:7)
我最终编写了自己的类,扩展了ScrollView
因为你问......这是代码。可能不是最干净的,但它可以做我想要的。
请注意,它期望在创建视图时设置layout_weight,并且不应在父LinearLayout中设置weigthSum,否则你会得到有趣的东西(因为这个的权重从原始值变为0取决于关于ScrollView内容的大小)
首先,在布局文件中,视图声明如下:
<com.matthieu.widget.ShrinkingScrollView
android:id="@+id/scroll"
android:scrollbars="vertical"
android:layout_height="0dp"
android:layout_width="fill_parent"
android:layout_weight="4"
android:background="#cc0000"
>
<TextView
android:id="@+id/in_scroll_view"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="#0000bb"
/>
</com.matthieu.widget.ShrinkingScrollView>
然后是小部件的代码:
import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import android.widget.ScrollView;
public class ShrinkingScrollView extends ScrollView {
private float original_weight=-1;
public ShrinkingScrollView(Context context) {
super(context);
}
public ShrinkingScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ShrinkingScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) getLayoutParams();
float previous_weight = params.weight;
if (original_weight == -1)
original_weight = params.weight;
if ((getChildCount()>0) && (getVisibility()!=GONE)) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED));
int overall_height = getChildAt(0).getMeasuredHeight();
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (getMeasuredHeight() >= overall_height) {
if (previous_weight != 0) {
params.weight=0;
params.height = overall_height;
setLayoutParams(params);
post(new Runnable() {
public void run() {
requestLayout();
}
});
}
setMeasuredDimension(getMeasuredWidth(),overall_height);
}
else if (previous_weight == 0) {
params.weight = original_weight;
params.height = 0;
setLayoutParams(params);
post(new Runnable() {
public void run() {
requestLayout();
}
});
}
}
else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}
答案 1 :(得分:0)
如果我理解你的要求,我做这样的事情的方法是将scrollview和你想在其下面显示的任何内容放在一个Relative布局中。然后,在您的布局文件中首先将项目放在文件的屏幕底部(使用android:layout_alignParentBottom =“true”),然后将滚动视图放在第一个项目上方,使用类似于:android:layout_above = “@ ID /与firstItem”。像这样我在底部放置了一个图像视图,上方有一个滚动视图,占用了剩余的空间:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/searchByNameScreen"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_horizontal"
android:layout_marginTop="1dip"
android:gravity="center_horizontal"
android:orientation="vertical" >
<ImageView
android:id="@+id/bottomImage"
android:layout_width="fill_parent"
android:layout_height="75dip"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:paddingBottom="15dip"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:paddingTop="7dip"
android:scaleType="fitXY"
android:src="@drawable/android_450x50_moreinfo" />
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ScrollView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@id/bottomImage"
android:layout_marginBottom="3dip"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
android:layout_marginTop="1dip"
android:scrollbars="none" >
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/aboutCopyLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/aboutTopLayer"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal"
android:background="@drawable/rounded_background"
android:gravity="center"
android:padding="5dip" >
<!-- android:background="@drawable/rounded_background" -->
<TextView
android:id="@+id/aboutCopyText"
style="@style/ResortNameExtraLine"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:text="@string/aboutCopy" />
</LinearLayout>
</ScrollView>
</RelativeLayout>
答案 2 :(得分:0)
这里是使用尺寸而不是重量的另一种解决方案。我已经扩展了ScrollView并添加了代码来实现此功能:
https://gist.github.com/JMPergar/439aaa3249fa184c7c0c
我希望这很有用。
答案 3 :(得分:0)
JMpergar的答案似乎没错,但是在我改变了如下的onMeasure方法之前它没有用。
DeletedAt == null
答案 4 :(得分:0)
您可以将 ScrollView
包裹到另一个 ConstraintLayout
中,然后限制高度(行 app:layout_constrainedHeight="true"
):
<!-- another constraint layout to keep ScrollView shrinking -->
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constrainedHeight="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/content_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">