打开软键盘时,DialogFragment 始终会调整大小

2024-02-12

我在全屏显示的自定义 DialogFragment 方面遇到一些问题。该对话框包含可滚动的内容并具有自动完成文本视图。

最初,对话框在顶部显示有边距 - 以编程方式设置为布局内容顶部的透明视图。一旦 autocompletetextview 获得焦点,该边距就会减少到 0(从而给人一种对话框正在进入全屏模式的错觉)。此时键盘也显示出来。

目前,键盘缩小了对话框的大小,并且对话框上的按钮向上移动到键盘上方。这会产生一个问题,因为一旦 autocompletetextview 失去焦点,对话框就会调整大小,并且由于键盘大小调整也会产生闪烁: 他们的键盘被隐藏 - >对话框被移动到底部 -> 对话框调整为全屏 -> 对话框调整为初始大小

当前创建的对话框:

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);

        dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);

        if (!hasTitle()) {
            dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        }

        // the content
        //final RelativeLayout root = new RelativeLayout(getActivity());
        //root.setLayoutParams(
        //        new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        //dialog.setContentView(root);

        if (position != null) {
            WindowManager.LayoutParams windowParams = dialog.getWindow().getAttributes();
            windowParams.x = position.x;
            windowParams.y = position.y;
            dialog.getWindow().setAttributes(windowParams);
        } else {
            dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        }

        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(hasTitle() ? Color.WHITE : Color.TRANSPARENT));
        dialog.getWindow().setGravity(Gravity.TOP | Gravity.START);

        return dialog;
    }

这部分有效,因为对话框没有填充宽度,它要小得多。

有些东西确实解决了这个问题,但它又产生了另一个问题:

@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_DeviceDefault_DialogWhenLarge_NoActionBar);
    }

但这会影响对话框背景的外观,并且我似乎无法从对话框创建方法中更改它。


我终于找到了解决我的问题的方法。

对话框的创建:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);

    if (!hasTitle()) {
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    }

    if (position != null) {
        WindowManager.LayoutParams windowParams = dialog.getWindow().getAttributes();
        windowParams.x = position.x;
        windowParams.y = position.y;
        dialog.getWindow().setAttributes(windowParams);
    } else {
        WindowManager.LayoutParams attrs = dialog.getWindow().getAttributes();
        attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
        dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    }

    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(hasTitle() ? Color.WHITE : Color.TRANSPARENT));
    dialog.getWindow().setGravity(Gravity.TOP | Gravity.START);

    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);    

    return dialog;
}

片段的创建(我自定义对话框的样式 - 使用No_FRAME非常重要):

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // We customize the style of this dialog - we remove the frames of the dialogs and leave the drawing to the
    // onCreateView() method, and we use the custom theme for dialogs - this is a special theme which has no
    // Background and the status bar is left unchanged
    setStyle(DialogFragment.STYLE_NO_FRAME, R.style.Theme_Dialog);
}

自定义主题(我重复使用所有样式,以便对话框看起来相同):

<!-- Custom theme for dialogs - this will use the same styling as the main theme, but will disable the background
 of the window, and it will also leave the status bar color unchanged -->
<style name="Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <!-- We do not want to change the status bar color -->
    <item name="colorPrimaryDark">@color/transparent</item>
</style>

现在,我的对话框片段看起来像是全屏的,并且在打开软键盘时不再调整大小,因此在手动更改其大小时会产生闪烁效果。 最重要的是DialogFragment.STYLE_NO_FRAME.

我希望这能帮助其他有类似问题的人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打开软键盘时,DialogFragment 始终会调整大小 的相关文章

随机推荐

  • 如何恢复 Normalize.css 的 input[type="search"] 的 webkit 外观

    我正在使用normalize css 它确实删除了搜索输入的图标 input type search webkit search cancel button input type search webkit search decoratio
  • 如何处置 System.Windows.Media.MediaPlayer

    问题很简单 可以概括为 我怎样才能让这个 while 循环退出 System Windows Media MediaPlayer player new System Windows Media MediaPlayer WeakReferen
  • 选择要上传的文件会导致移动 Safari 崩溃

    至少在我的 iPhone 6 Plus 上 当我使用
  • 为什么我无法在 Android Studio 中安装 lldb

    我想在JNI期间设置断点 但是当我编辑配置时 我无法安装lldb插件 任何人都可以帮助我吗 安卓工作室 2 1 1 LLDB 现在可以通过集成到 Android Studio 中的 SDK 管理器来使用 该管理器位于 Android Stu
  • 属性存在但 property_exists() 返回 false;

    嗯 我真的很困惑 当我检查属性是否存在时 它返回 false if property exists pais id false 但当我调试时它告诉我它就在那里 print r pais gt id 1 print r property ex
  • 如何在 Verilog 中综合 While 循环?

    我尝试设计一个 Booth 乘法器 它在所有编译器中运行良好 包括 Modelsim Verilogger Extreme Aldec Active Hdl 和 Xilinx Isim 我知道模拟和综合是两个不同的过程 而且只有少数Veri
  • 使用 SELECT 执行 INSERT 插入多条记录

    在下图中 DodgyOldTable 和 MainTable 之间存在 1 1 关系 表 Option 包含 OptionDesc 字段中带有 OptionVal1 OptionVal2 和 OptionVal3 的记录 我需要使用 Dod
  • PHP 中未终止的实体引用

    这是我的代码
  • 什么是名称查找机制?

    我想知道C 名称查找机制是什么 名称查找是识别名称含义的过程 名称查找有两个目的 消除代码解析的歧义 确定代码的确切含 义 例如 如果你有这个代码 T a 这取决于是否T是否是一个类型 如果是一个类型 它将是一个声明a 如果它不是类型 则将
  • 我必须在 Next.js 项目中使用express吗?

    我正在制作一个网站Next js Next js提供SSR and dynamic routing 我必须使用express 如果是这样 为什么我必须使用它 具有什么样的特点express有用但未提供的Next js I think nex
  • 提供满足esm、commonjs和bundlers的模块、主要和浏览器字段

    我有许多已发布的 npm 包 我已将它们升级为提供 commonjs 和 esm 构建 有些包可能同时适用于节点和浏览器 所有使用 webpack 或 rollup 编译的包 所有内容都用打字稿编写并转换为dist目录 我创建了一个comm
  • iOS 上的 html5 录音

    我正在尝试访问 iOS 上的麦克风以捕获用户输入
  • Azure SQL 中所有用户的列表

    如何列出可以连接到我的 sql server 数据库的所有用户 现在可以找到任何 sql 命令 我尝试了互联网上的一些链接 但没有一个有效 我尝试过的一些命令 SELECT FROM sys sql logins SELECT FROM s
  • 我应该如何配置 grunt-usemin 来使用相对路径

    我有一个由 yeoman generator 支持的 grunt 项目 我是基于generator webapp https github com yeoman generator webapp 如果有帮助 您可以在GitHub https
  • MVVM 和 StructureMap 的使用

    我的 MVVM 应用程序中有大量父级详细信息 ViewModel 像这样的事情 SchoolsViewModel SchoolViewModel LessonViewModel PupilsViewModel PupilViewModel
  • Bitset 作为函数的返回值

    我想要一个接口 其函数返回一个位集 class IMyInterface public virtual std bitset lt 100 gt GetBits 0 问题是我不想强制大小bitset 所以我想我必须使用boost dynam
  • Ruby 2.0 字节码导出/导入

    我一直在读关于红宝石 2 0 新功能 http www rubyinside com ruby 2 0 implementation work begins what is ruby 2 0 and whats new 5515 html
  • 使用 JavaScript 创建 Base64 编码图像

    由于图像是数据 我们可以将代码编写为 img src alt Red dot 现在我的观点是 我们可以使用 javascript 创建 base64 数据吗 有什么框架吗 我的实际要求是我有一个像 Cow 这样的字符串 我希望它作为图像 注
  • Java 最终抽象类

    我有一个非常简单的问题 我想要一个 Java 类 它提供一个公共静态方法 该方法可以执行某些操作 这只是为了封装目的 将所有重要的内容都放在一个单独的类中 这个类既不应该被实例化 也不应该被扩展 这让我写道 final abstract c
  • 打开软键盘时,DialogFragment 始终会调整大小

    我在全屏显示的自定义 DialogFragment 方面遇到一些问题 该对话框包含可滚动的内容并具有自动完成文本视图 最初 对话框在顶部显示有边距 以编程方式设置为布局内容顶部的透明视图 一旦 autocompletetextview 获得