在LinearLayout视图中折叠和滚动视图

时间:2015-02-13 16:13:27

标签: android-layout android-layout-weight

我试图在软键盘打开时在包含两个片段的Android布局中创建一个非常具体的行为,如下左图所示。

片段A是一种需要软键盘输入的形式,片段B是一个摄影幻灯片,只是作为视觉填充物。

Behavior of android layout while opening keyboard 蓝色轮廓表示根视图。片段A是固定高度,片段B填充剩余的垂直空间。当键盘打开时,片段B会折叠直到其高度为0,此时片段A变为可滚动。

我尝试过以下方法:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <FrameLayout
      android:id="@+id/FragmentB"
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1" />
  <ScrollView
      android:layout_width="match_parent"
      android:layout_height="wrap_content">
    <FrameLayout
        android:id="@+id/FragmentA"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
  </ScrollView>
</LinearLayout>

在此视图中,当软键盘打开而片段A折叠时,片段B保持相同的高度。

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
  <LinearLayout
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
    <FrameLayout
        android:id="@+id/FragmentB"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
    <FrameLayout
        android:id="@+id/FragmentA"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
  </LinearLayout>
</ScrollView>

在此视图中,碎片B不断折叠,碎片A下方视图底部仍留有间隙。

如何实现上图中列出的布局行为?

谢谢!

1 个答案:

答案 0 :(得分:1)

我在这里找到了一个解决方案:

Min height fill_parent and height wrap_content in ScrollView? 我得到的代码是:

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">  <!-- FillViewport ensures the scrollview doesn't wrap the content -->
  <LinearLayout
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_weight="1"> <!-- Layout weight 1 means the LinearLayout will at least fill the scrollview, or wrap content if too big -->
    <FrameLayout
        android:id="@+id/FragmentB"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
    <FrameLayout
        android:id="@+id/FragmentA"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
  </LinearLayout>
</ScrollView>