最简单的方法是不使用 BottomSheetDialogFragment,而是使用覆盖整个窗口或活动的常规片段。片段或活动;只要您占据整个屏幕,您喜欢哪个都没有关系。
当屏幕键盘出现时,活动窗口(默认情况下)会调整大小以便为屏幕键盘让路。
由于 BottomSheetDialogFragment 将其重力设置为bottom
,因此当活动窗口调整大小时,它会将底部工作表及其所有内容向上推。
这是一个最简单的布局示例,可以实现您的目标
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#80000000" />
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
首先是一个具有恒定高度的视图,它模仿了对话框之外的黑暗区域。无论窗口如何调整大小,这将始终是80dp
。
其次是 RecyclerView,它根据 LinearLayout 的剩余可用空间调整大小。注意属性android:layout_weight
。
第三个是 EditText,它的高度恒定为wrap_content
. 再次无论窗口如何调整大小,这将始终是相同的高度。由于 RecyclerView 将尽可能多地占用空间,因此此 EditText 将保留在屏幕底部。
一旦由于屏幕键盘的出现而调整窗口大小,LinearLayout 将调整大小并重新计算其子级大小。由于 View 和 EditText 具有恒定的高度,因此必须使 RecyclerView 更小,使其看起来像 EditText 向上移动。
您不必使用 LinearLayout 来执行此操作,您可以使用任何其他布局来实现相同的效果。这里的重点是使用占据整个屏幕的布局。