关于 ScrollViews 的常见问题似乎是如何使用 fillViewport 让 ScrollView 伸展到整个屏幕。我的问题是相似的,但反过来:)
我有一个包含多个元素的 LinearLayout。除了一个元素外,所有元素都有固定的高度,特别的是一个应该拉伸以填充剩余空间的 ImageView。这很好用:)
现在我想将 LinearLayout 放入 ScrollView,因为我的一些元素应该在运行时展开(例如,单击展开 TextView 的“更多”图标)。在未展开的版本中,我希望所有元素都适合屏幕,就好像 ScrollView 不存在一样。
不幸的是,当将 ScrollView 包裹在 LinearLayout 周围时,ImageView 被缩放到 maxSize 并且屏幕不适合屏幕。您对如何实现我的目标有任何想法吗?
我在一个示例应用程序中重现了该问题与您分享:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ImageView
android:layout_width="fill_parent"
android:layout_height="0px"
android:layout_weight="1"
android:background="#ffff0000"
android:scaleType="fitCenter"
android:src="@drawable/background" />
<TextView
android:layout_width="fill_parent"
android:layout_height="80dp"
android:background="#ff00ff00"
android:text="element 2"
tools:context=".MainActivity" />
<TextView
android:layout_width="fill_parent"
android:layout_height="80dp"
android:background="#ff00ff00"
android:text="element 1"
tools:context=".MainActivity" />
</LinearLayout>
</ScrollView>
以下是两个版本的截图:
上面的一个是带有 ScrollView 的布局(注意滚动条和元素 1 的裁剪),下面的一个没有。
更新:图像视图中图像的原始高度大于屏幕。所以它应该被缩小(这就是为什么它有 weight 1 和 scaleType 集)。
解决方案:以下代码为我解决了问题(基于 Luksprog 答案)
Main Activity(摘录,布局的变化是通过点击 ImageView 引起的):
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scrollView = (ScrollView) findViewById(R.id.scroller);
frame = (FrameLayout) findViewById(R.id.frame);
layout = (LinearLayout) findViewById(R.id.layout);
final ImageView image = (ImageView) findViewById(R.id.image);
image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ImageView image = (ImageView) findViewById(R.id.image);
frame.removeView(layout);
scrollView.addView(layout);
image.getLayoutParams().height = image.getHeight();
}
});
}
布局 XML 文件
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ScrollView
android:id="@+id/scroller"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:fillViewport="true"
>
</ScrollView>
<LinearLayout
android:id="@+id/layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ImageView
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="0px"
android:layout_weight="1"
android:background="#ffff0000"
android:scaleType="fitCenter"
android:src="@drawable/background" />
<TextView
android:id="@+id/text1"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:background="#ff00ff00"
android:text="element 2"
tools:context=".MainActivity" />
<TextView
android:layout_width="fill_parent"
android:layout_height="80dp"
android:background="#ff00ff00"
android:text="element 1"
tools:context=".MainActivity" />
<TextView
android:layout_width="fill_parent"
android:layout_weight="0.1"
android:layout_height="0px"
android:background="#ff00ff00"
android:text="element 3"
tools:context=".MainActivity" />
</LinearLayout>
</FrameLayout>