折叠布局但将另一个布局放在底部

Fold up a Layout but keep another at the bottom

我有这样的布局:

没有颜色:https://i.stack.imgur.com/OdSda.png

如果我单击 D 旁边的 EditText 并打开键盘,我希望发生什么:

实际上发生了什么

有两件事我已经尝试过,但都没有按预期完全工作:

I) 添加 android:windowSoftInputMode="adjustPan" 到清单:

II) 将 android:windowSoftInputMode="adjustResize" 添加到清单:没有任何变化,除非我也将 android:fitsSystemWindows="true" 添加到选项卡片段的 xml:

所以这就是我想出的:无论我多么努力地尝试 devices/emulators 上的键盘总是在 layout 3 的底部我检查了高度从 开始的设备4.7 inches min。如果你把 adjust:resize 放在清单文件中,它总是会在 top of keyboard 上显示最后的布局。但是如果你放置 adjust:nothing 那么你的 底部布局将不会显示 即使你想在上面写点东西。如果你把 adjust:adjutPan 然后它会像你说的那样将你的 布局推到顶部 。现在来到keyboard part:

如果您想测量高度或检查您的键盘是否覆盖了您的布局,那么您需要测量屏幕和键盘的高度并找出差异。看看这个问题。

How to check visibility of software keyboard in Android?

根据该结果,您可以显示或隐藏布局。

注意:如果您希望按原样满足要求,则必须设计自定义布局。

我找到方法了! :) 非常感谢 Umair 为我提供了 ScrollView 的提示并测试了不同的东西!

首先,现在整体布局是这样搭建的:

  • Surrounding RelativeLayout 1(没什么特别的,没有 android:fitsSystemWindows="true" - ScrollView 似乎无论如何都禁用它!)
    • 新的滚动视图
      • new RelativeLayout(ScrollView只能包含一个元素!)
        • 相对布局 2
          • 线性布局 A(TextView + EditText)
          • 线性布局 B(TextView + EditText)
          • LinearLayout C (TextView + EditText)
          • "Save" 按钮
        • 相对布局 3
          • LinearLayout D (TextView + EditText + "OK" 按钮)
    • RelativeLayout 4 (TextView E)

清单:

<activity android:name=".MainActivity"
    android:windowSoftInputMode="adjustResize"
....

RelativeLayout 4 的代码:

之前:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_gravity="bottom">
    <TextView
        android:id="@+id/textE"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/E"
        android:textSize="20sp"/>        
</RelativeLayout>

之后:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_gravity="bottom"
    android:layout_below="@id/ScrollViewABCD"
    android:gravity="bottom">
    <TextView
        android:id="@+id/textE"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/E"
        android:textSize="20sp"/>
</RelativeLayout>

我不确定是否真的需要 android:layout_gravity="bottom"android:gravity="bottom" 是为了让文本位于底部!)但我也没有注意到没有它的任何变化。

android:layout_alignParentBottom="true" 是这里的重要部分,因为如果没有它,Relative Layout 4 将位于 ScrollView 的正下方,但是这个额外的小部分使它用尽了它可以使用的所有 space,同时仍然保持它尽可能向南。此外,您仍然可以使用边距在 ScrollView 和 RL 4 之间创建一些空白 space(即使您只会在 Android Studio 的预览 window 中看到它)。

这是做什么的:

  • ScrollView 可用
  • 键盘始终在 ScrollView 下方
  • 如果 space 不足以显示 ScrollView 和键盘,则前者变为可滚动
  • RelativeLayout 4 总是隐藏在键盘后面
  • 标签保留在原处
  • RelativeLayout 1 的填充不会被忽略(就像 android:fitsSystemWindows="true" 一样)