【问题标题】:BottomSheetDialogFragment behaviour when showing keyboard [duplicate]显示键盘时的BottomSheetDialogFragment行为[重复]
【发布时间】:2020-06-04 12:56:35
【问题描述】:

我正在使用一个 BottomSheetDialogFragment,其中包含: - 带有用户创建的 cmets 列表的 RecyclerView - 底部的 EditText,用户可以在其中撰写新评论并发布

当用户点击 EditText 时,键盘会从底部显示出来。 我想要的是键盘仅推动 EditText,以便用户可以看到他正在输入的内容,但不能推动整个 BottomSheetDialogFragment。

例如,您可以在 Facebook 应用中看到理想的行为。

我尝试为setSoftInputMode 设置不同的值,但我所能做到的就是移动整个BottomSheetDialogFragment,或者什么都不移动(让EditText 被覆盖)。

【问题讨论】:

    标签: android android-softkeyboard bottom-sheet android-bottomsheetdialog


    【解决方案1】:

    最简单的方法是不使用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 来执行此操作,您可以使用任何其他布局来实现相同的效果。这里的重点是使用占据整个屏幕的布局。

    【讨论】:

    • 感谢您的回答。那你觉得用BottomSheet做不到吗?我的想法是显示两个独立的 BottomSheets,其 softInputMode 的值不同,一个用于 recyclerview,另一个用于顶部的 EditText ...当键盘出现时,第一个模式将保持其位置,而第二个模式将被推动.
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 2019-03-08
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多