当前位置: 首页 > 知识库问答 >
问题:

如何使用最新的WindowInset API在软键盘出现时调整对话框布局

薛烨
2023-03-14

如何使用最新的WindowInset API调整我的对话框和软键盘之间的空间?

我有一个带有一些编辑文本的BottomSheetDialog。默认动画将在我的EditText正下方显示软键盘,它将覆盖我的保存按钮。在做了一些研究之后,我将这一行添加到我的“BottomSheetDialog”片段中

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

它起作用了(如下图)!

这就是我想要的

但显然SOFT_INPUT_ADJUST_RESIZE已弃用。

   * @deprecated Call {@link Window#setDecorFitsSystemWindows(boolean)} with {@code false} and
   * install an {@link OnApplyWindowInsetsListener} on your root content view that fits insets
   * of type {@link Type#ime()}.

我不知道如何使用新的应用WindowInsetsListener来达到同样的效果。这是我当前的“BottomSheetDialog”片段:

public class BottomSheetDialog extends BottomSheetDialogFragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

//      Adding this line works, but it's deprecated in API 30
//      getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
      
        getDialog().getWindow().setDecorFitsSystemWindows(false);
        view = inflater.inflate(R.layout.fragment_bottom_dialog_cash, container, false);
        view.setOnApplyWindowInsetsListener((v, insets) -> {
            Log.d("dialog", "onCreateView: ");
            Insets imeInsets = insets.getInsets(WindowInsets.Type.ime());
            v.setPadding(0,0,0,imeInsets.bottom);
            return insets;
        });
        return view;
    }

我在另一个片段中使用onclicklistener来显示此对话框。另一个片段中的代码

    @Override
    public void onItemClick(int position) {
        BottomSheetDialog dialog = new BottomSheetDialog();
        dialog.show(getParentFragmentManager(), "BottomSheetDialog");
    }

事实上,日志表明,当软键盘弹出时,监听器从未被触发。仅供参考,我正在关注此视频和此博客。

共有3个答案

葛泳
2023-03-14

唯一对我有用的是设置BottomSheetDialog的样式以使用以下内容:

<style name="BottomSheetDialogTheme" parent="Theme.MaterialComponents.Light.BottomSheetDialog">
  <item name="android:windowIsFloating">false</item>
  <item name="android:windowSoftInputMode">adjustResize|stateVisible</item>
</style>
夏侯浩气
2023-03-14

比较版本

WindowCompat.setDecorFitsSystemWindows(window, false)
ViewCompat.setOnApplyWindowInsetsListener(rootView()) { _, insets ->
    val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom
    rootView().setPadding(0, 0, 0, imeHeight)
    insets
}

或使用Insetter库

 WindowCompat.setDecorFitsSystemWindows(window, false)
 rootView().applyInsetter {
        type(ime = true) {
            padding()
        }
    }
仉俊能
2023-03-14

经过更多的研究,我发现如果我使用<代码>视图绑定<代码>并将<代码>视图<代码>替换为<代码>绑定。getRoot(),则一切正常。我不知道为什么(也许我应该在onViewCreated中使用,而不是在onCreateView中使用?)但是代码应该对有相同问题的人有所帮助。

// NOTE: you have to set this in the activity instead of fragment.
getWindow().setDecorFitsSystemWindows(false);

// Only work with API30 or above!
bind.getRoot().setOnApplyWindowInsetsListener((v, insets) -> { 
    imeHeight = insets.getInsets(WindowInsets.Type.ime()).bottom;
    bind.getRoot().setPadding(0, 0, 0, imeHeight);
    return insets;
});

需要注意的是,setDecorfitsystemwindows(false)表示应用程序(您)负责所有系统窗口,包括状态栏和导航栏。

我还发现下面链接的教程非常有用,如果您想了解更多有关windowInsets和新动画回调的信息,请查看。

用于检查键盘(IME)可见性和大小的新WindowInsets API

Android 11的窗口插入和键盘动画教程

 类似资料:
  • 我想在软键盘激活时调整版面的大小,如下所示: 前后: 在SO: 在显示软键盘时如何保持所有字段和文本可见 安卓软键盘出现时破坏布局 软键盘打开时调整布局 但问题和答案是相当模糊的,这里的问题更清楚地描述了我想要什么。 要求: 它应适用于任何屏幕大小的电话。 注意到“facebook”和“注册facebook”处的边距/填充空间前后发生了变化。 不涉及滚动视图。

  • 当软键盘出现在屏幕上时,我需要软键盘和编辑文本之间正好有50dp的间隙。最终的输出会像这样 我怎样才能做到这一点?清单中的调整平移或调整调整大小并没有给我具体的差距。

  • 我想在激活软键盘时更改布局元素,如下所示: 这是一个关于我想要什么的问题。 要求: 注意到“忘记密码”视图消失,“Facebook图像”和“创建新Facebook帐户”视图完全改变。我们如何实现这样的布局。 不涉及滚动视图。 布局应该适用于任何屏幕尺寸的手机。

  • 大家早上好,当显示键盘时,我有一个关于调整布局大小的小问题。 在清单中,我有调整调整大小,我也试图使用调整潘,但我有问题与滚动的回收器视图。 我的布局代码是: 谢谢,谁能帮我

  • 问题内容: 打开虚拟键盘后,它将调整我的布局大小。我如何才能将键盘放在布局上?并没有改变我的布局尺寸? 问题答案: 您可以使用清单标志来配置虚拟键盘的效果。请参阅http://developer.android.com/guide/topics/manifest/activity- element.html#wsoft

  • 这是一个布局: 我希望在触摸EditText并显示软键盘时,蓝色条保持不变。一、 我希望它的大小和位置得到保留。我在AndroidManifest中尝试了我的活动参数android:WindowsofInputMode的所有四个可能值。我的蓝条总是在软键盘上移动或收缩: android:WindowsofInputMode=“adjustUnspecified”或默认设置: android:win