Android - 在键盘上方显示BottomSheetDialogFragment

时间:2018-05-07 22:33:22

标签: android android-softkeyboard bottom-sheet

我正在尝试显示一个BottomSheetDialogFragment,其中包含几个EditText字段,供用户输入信息。我想直接在键盘上方显示它,但它会不断覆盖内容。

当我调出BottomSheetDialogFragment时会发生这种情况,您可以看到它正在选择Card Number EditText,但会覆盖其他内容。

BottomSheetDialogFragment covering up content

理想情况下,这就是我要找的东西,你可以看到EditTexts和视图的填充。

BottomSheetDialogFragment not covering up content

我尝试了许多围绕windowSoftInputMode的解决方案,但似乎没有任何效果。我已将其设为adjustResize为父Activity和实际BottomSheetDialogFragment来自

dialog.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)

我还尝试修改我的布局,将其从FrameLayout更改为ScrollViewCoordinatorLayout,看看是否对布局的位置有任何影响,但似乎没有任何效果。

如果有人知道如何做到这一点,那将非常感谢,谢谢。

6 个答案:

答案 0 :(得分:1)

以下步骤可能有助于解决您的问题。

首先在xml文件中的EditText上添加以下行

android:imeOptions="actionSend|flagNoEnterAction"

例如:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:hint="Card number"
    android:imeOptions="actionSend|flagNoEnterAction"/>

然后在AndroidManifest.xml文件中的activity标记上添加以下行

android:windowSoftInputMode="stateVisible|adjustResize"

例如:

<activity android:name=".stack.MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

您可以从here找到有关屏幕输入法的更多详细信息。

答案 1 :(得分:0)

Android操作系统本身不支持在虚拟键盘上添加填充,但有很多方法可以使用它。

一种方法是收听编辑文本的焦点,然后滚动ScrollView:

edittext.setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus)
             scrollView.scrollBy(0, 100);

    });

正如我所说,这种方式很黑,不推荐。

另一种方式(取决于您的布局,如果让它工作则更好)是为您的活动设置windowSoftInputModeadjustPanadjustResize(取决于您的布局)在AndroidManifest.xml中。

答案 2 :(得分:0)

尝试此BottomSheetDialogFragment:

com.amazon.avod.thirdpartyclient

答案 3 :(得分:0)

我不得不扩大版面高度。 How to change the default height of bottomsheet dialog fragment?中的编程方法没有帮助,所以我只是更改了布局。

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <View
        android:id="@+id/top_space"
        android:layout_width="match_parent"
        android:layout_height="10dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

    <!-- Other views -->

    <View
        android:id="@+id/bottom_space"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/button"
        app:layout_constraintVertical_weight="1"
        />

</android.support.constraint.ConstraintLayout>

答案 4 :(得分:0)

我终于在打开键盘时更改了对话框的高度,并在关闭时将其调整为正常大小。

KeyboardVisibilityEvent库:https://android-arsenal.com/details/1/2519

  KeyboardVisibilityEvent.setEventListener(activity) { isOpen ->
            setDialogHeight(isOpen)
  }

支持的最低SDK版本为2.0.0为14

并在键盘打开时将对话框高度设置为80%:

    /**
     * Changes size of dialog based on keyboard visibility state
     */
    private fun setDialogHeight(expanded: Boolean) {
        val dialog = dialog as BottomSheetDialog?
        val bottomSheet =
            dialog!!.findViewById<View>(com.google.android.material.R.id.design_bottom_sheet) as FrameLayout?
        val behavior = BottomSheetBehavior.from(bottomSheet!!)

        val displayMetrics = activity!!.resources.displayMetrics

        val width = displayMetrics.widthPixels
        val height = displayMetrics.heightPixels

        val maxHeight = (height * 0.88).toInt()

        behavior.peekHeight = if (expanded) maxHeight else -1
    }

答案 5 :(得分:0)

可能答案较晚,但可能会有所帮助。

没有别的对我有用。但是此解决方案有效

在NestedScrollView内部包装布局

<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

     <--Rest of the layout-->
</androidx.core.widget.NestedScrollView>

内部样式:

    <style name="BottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog">
        <item name="bottomSheetStyle">@style/AppModalStyle</item>
        <item name="android:windowIsFloating">false</item>
        <item name="android:windowSoftInputMode">adjustResize</item>
    </style>

    <style name="AppModalStyle" parent="Widget.Design.BottomSheet.Modal">
        <item name="android:background">@drawable/rounded_corner_dialog</item>
    </style>

此处android:windowIsFloating为假,android:windowSoftInputMode必须为adjustResize