如何防止自定义 DialogFragment 在显示时隐藏键盘

2024-02-28

有 2 种方法可以通过以下方式创建自定义对话框DialogFragment.

  1. 覆盖onCreateDialog并使用返回一个对话框AlertDialog.Builder.
  2. 覆盖onCreateView.

我们注意到,如果我们覆盖onCreateDialog,之前显示的软键盘不会被隐藏。

但是,如果我们覆盖onCreateView, 先前显示的软键盘将被隐藏。

onCreateDialog不会隐藏软键盘


onCreateView将隐藏软键盘


隐藏软键盘不是我们想要的行为。我们希望软键盘保持原样。

但是,我们无法使用onCreateDialog方式,由于提到的限制DialogFragment 中的 ViewPager - IllegalStateException:片段没有视图 https://stackoverflow.com/questions/20303865/viewpager-in-dialogfragment-illegalstateexception-fragment-does-not-have-a-vi。简而言之,如果您需要ViewPager为了在对话框中正常工作,您不能使用以下方法实现自定义对话框onCreateDialog.

如果我们使用onCreateView,我们可以实现想要的一切,除了“不隐藏软键盘”。

你知道为什么要覆盖吗onCreateView创建自定义对话框,会隐藏键盘吗?我们怎样才能防止这种行为呢?


Code

我的对话框风格是:

<style name="CustomDialog" parent="@style/Theme.AppCompat.Light.Dialog">
    <item name="android:windowNoTitle">false</item>
</style>

ColorDialogFragment.java:

public class ColorDialogFragment extends DialogFragment {
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private ColorFragmentPagerAdapter colorFragmentPagerAdapter;

    public static ColorDialogFragment newInstance() {
        ColorDialogFragment colorDialogFragment = new ColorDialogFragment();
        // We provide custom style, because we need title.
        colorDialogFragment.setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialog);
        return colorDialogFragment;
    }

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

    @Override
    public void onResume() {
        super.onResume();
        getDialog().getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    }

    private View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container) {
        View view = inflater.inflate(R.layout.color_dialog_fragment, container, false);

        this.tabLayout = view.findViewById(R.id.tab_layout);
        this.viewPager = view.findViewById(R.id.view_pager);
        this.colorFragmentPagerAdapter = new ColorFragmentPagerAdapter(this.getChildFragmentManager());
        this.viewPager.setAdapter(this.colorFragmentPagerAdapter);
        this.tabLayout.setupWithViewPager(this.viewPager);

        return view;
    }

    // We overwrite onCreateView because ViewPager in DialogFragment, can hardly play well with
    // onCreateDialog + AlertDialog.Builder.
    //
    // https://stackoverflow.com/questions/20303865/viewpager-in-dialogfragment-illegalstateexception-fragment-does-not-have-a-vi
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return onCreateView(inflater, container);
    }

    // We overwrite onCreateDialog, because we need title.
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.setTitle(R.string.select_a_color);
        return dialog;
    }
}

经过一天的实验,我找到了解决方案!

覆盖两者onCreateDialog and onCreateView。商店视图创建于onCreateDialog在成员变量中,并让onCreateView返回该成员变量。

参考:https://stackoverflow.com/a/51530917/72437 https://stackoverflow.com/a/51530917/72437

这是完整的代码。

public class ColorDialogFragment extends DialogFragment {
    private View view;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private ColorFragmentPagerAdapter colorFragmentPagerAdapter;

    public static ColorDialogFragment newInstance() {
        ColorDialogFragment colorDialogFragment = new ColorDialogFragment();
        return colorDialogFragment;
    }

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

    @Override
    public void onResume() {
        super.onResume();
        getDialog().getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);


        // TODO: Read from WeNoteOptions.
        final int position = 0;
        this.viewPager.setCurrentItem(position);
        updateButtonVisibility(position);
    }

    private View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container) {
        View view = inflater.inflate(R.layout.color_dialog_fragment, container, false);

        this.tabLayout = view.findViewById(R.id.tab_layout);
        this.viewPager = view.findViewById(R.id.view_pager);
        this.colorFragmentPagerAdapter = new ColorFragmentPagerAdapter(this.getChildFragmentManager());
        this.viewPager.setAdapter(this.colorFragmentPagerAdapter);
        this.tabLayout.setupWithViewPager(this.viewPager);

        this.viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                updateButtonVisibility(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        return view;
    }

    private void updateButtonVisibility(int position) {
        if (position == 1) {
            ((AlertDialog)getDialog()).getButton(DialogInterface.BUTTON_POSITIVE).setVisibility(View.VISIBLE);
        } else {
            ((AlertDialog)getDialog()).getButton(DialogInterface.BUTTON_POSITIVE).setVisibility(View.INVISIBLE);
        }
    }

    // https://stackoverflow.com/questions/20303865/viewpager-in-dialogfragment-illegalstateexception-fragment-does-not-have-a-vi
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return this.view;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        LayoutInflater layoutInflater = getActivity().getLayoutInflater();
        this.view = onCreateView(layoutInflater, null);
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity())
                .setTitle(R.string.select_a_color)
                .setView(this.view)
                .setPositiveButton(R.string.select_color, (dialogInterface, i) -> {

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

如何防止自定义 DialogFragment 在显示时隐藏键盘 的相关文章

  • Android SQLite 数据库从查询中删除重复项

    我是 SQLite 新手 我使用此查询是为了从特定用户的列中提取所有行 Cursor c db query true TABLE COLUMN USER user null null null null null 这是表格的示例 group
  • 订阅购买后失效日期无效

    我有一个带有应用内订阅的 Android 应用程序 用户购买订阅后 我通过 Google API 通过我们的后端请求 validUntilTimestampMsec 和 initiationTimestampMsec 返回的时间戳 init
  • Android 上的多处理

    我一直在 Android 上执行一些测试 以验证并行化算法 如 FFT 的性能可以提高多少 我通过使用带有 JNI FFTW 的 pthread 和 Java 线程 来自 JTransforms 来实现这些算法 我没有像预期那样通过使用线程
  • 如何创建没有标题的DialogFragment?

    我正在创建一个 DialogFragment 来显示一些有关我的应用程序的帮助消息 除了一件事之外 一切都工作正常 窗口顶部有一条黑色条纹 显示 DialogFragment 我认为它是为标题保留的 我不想使用它 这是特别痛苦的 因为我的自
  • 将 React Native 应用程序嵌入到现有的 ios/android 应用程序中

    我需要知道是否可以在现有的 ios android 应用程序中 嵌入 一个 React Native 应用程序 而不共享 React Native 应用程序代码 我们目前有一个 React Native 应用程序 它使用一些插件依赖项 并被
  • 从txt文件中读取数据而不下载它?

    我想从提供的文本文件中解析信息 有没有一种方法可以在应用程序中执行此操作 而无需先下载文件 以某种方式传输文本内容 打开到 URL 的 Http 连接 使用内置 HttpURLConnection 或使用 commons httpclien
  • Android 偏好设置中的“是”或“否”确认[重复]

    这个问题在这里已经有答案了 我需要在 设置 中实现 重置 选项 单击该设置后 将打开一个简单的对话框 要求确认 我看过了DialogPreference但我似乎无法在任何地方找到好的解决方案或教程 有人可以帮我吗 我是初学者 想法甚至代码都
  • Ionic4 电容器 android livereload?

    是否有可能在带有 livereload 的 Android 设备上运行带有电容器的 ionic 4 应用程序 我已经找了几个小时的答案了 但没有成功 请帮忙 如果使用最新版本 ionic cli 现在有一个命令ionic capacitor
  • Android 信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR) libwebviewchromium.so

    对于 android 4 4 我多次收到 Native crash at system lib libwebviewchromium so 错误 以下是设备包括 Xperia Z1 SO 01F 16 30 2 Galaxy Tab4 7
  • 如何以编程方式关闭画中画

    我在使用画中画模式时遇到了这个问题 当从 PIP 本身以外的其他位置再次打开 Activity 时 我想关闭 PIP 画中画 不是来自关闭按钮 我想要与 youtube 相同的场景 即当用户单击 PIP 画中画 时 它会打开相同的活动 但是
  • 在 Unity 中构建 apk 应用程序时包含文件

    在unity中构建apk文件时如何将文件和文件夹添加到apk文件中 我需要的是在Android上安装应用程序后 在应用程序的父目录 android data com company product files 中存在一些文件和文件夹 这是我
  • 标签栏随键盘一起上升

    这个问题之前已经发过 但是没有答案 Problem TabBar gt 2 个选项卡 选项卡一有一个Scrollview and an EddiText 标签二 其他 贴带时EditText 软键盘上升 TabBar与它一起 一个丑陋的解决
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • Google 的 Android OpenGL 教程是否教授了错误的线性代数?

    在帮助另一位用户解决有关该问题的问题后响应触摸事件 http developer android com training graphics opengl touch htmlAndroid教程 我下载了源代码 并且对我所看到的感到非常困惑
  • 谷歌地图URL中参数的含义是什么

    我正在 Android 上使用 Webkit 浏览器 我想在以下 URL 中获得一个红色 A 符号
  • Android 模拟器提示和技巧 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android IntentService无法实例化类;没有空构造函数

    我有一个MainActivity需要访问在线 API 从而使用网络资源 的类 这需要我在单独的文件中创建的后台线程HttpRequestService java MainActivity java public class MainActi
  • 如何检查设备上是否安装了电子邮件客户端

    我需要检查设备上是否安装了电子邮件客户端 我使用了以下代码 但它对我不起作用 public boolean isIntentAvailable final PackageManager packageManager getApplicati
  • 如何获取视图到手机底部的距离?

    如果我在布局上有某个视图 ImageView 例如 是否可以找到View的下边框到手机屏幕底部的距离 Thanks instantiate DisplayMetrics DisplayMetrics dm new DisplayMetric
  • Android 可扩展列表视图随机播放子项

    你好 我正在使用 Android Expandable listview 并用不同的视图在其中膨胀子视图 我遇到的问题是 当我展开视图然后打开另一个父视图时 布局中的子视图会变得混乱并在代码中膨胀错误的布局 这是我的两个项目的示例代码 这是

随机推荐

  • 如何配置 FlatFileItemWriter 将文件输出到 ByteArrayRecource?

    我遇到的情况是部署服务器不允许应用程序将文件输出到其文件系统 所以我要做的是配置FlatFileItemWriter 将结果文件输出到静态Resource属性 多线程在这里不是问题 我当前的代码是 flatFileItemWriter se
  • Azure Functions 应用程序见解中的自定义属性

    我正在 Azure Application Insights 中监视大量应用程序 在所有这些中 我向事件 跟踪等添加了一些自定义属性 以便我可以在门户中进行过滤 分组 是否可以将相同的自定义属性添加到与 Azure Functions 的内
  • 几秒钟后画布性能下降

    我编写了以下 1000 个边界方块演示来测试 HTML5 画布的功能 一开始运行良好 但几秒钟后 fps 明显下降 我不知道为什么 任何指示将不胜感激 var c document getElementById canvas var con
  • 通过Powershell十六进制编辑二进制文件的方法

    我正在尝试仅使用 PowerShell 从命令行执行二进制十六进制编辑 我已经部分成功地用这个片段执行了十六进制替换 我的问题出现时123456发生多次 因为替换只应该在特定位置进行 Note 该片段需要Convert ByteArrayT
  • 将 Bokeh 更新为 0.5.0,现在可以在一个窗口中绘制所有以前版本的图表

    在更新之前 我会运行脚本并输出 html 文件 窗户上将有我的一处地块 我会对我的脚本进行更改 运行它 输出 html 文件 查看新的绘图 然后我再次安装该库以使用 conda 更新它 我对脚本做了一些更改 再次运行它 输出文件包括我进行一
  • 一张背景图片适用于多个 div

    我想使用 1 个背景图像 1366x768 在多个 div 中使用 但如果我使用 my divs background image url image jpg 我只有每个 div 上图像的左上角 我想使用基于 div 位置的图像部分 我可以
  • 如何使用Slick2.0.1映射postgresql自定义枚举列?

    我就是想不通 我现在使用的是 abstract class DBEnumString extends Enumeration implicit val enumMapper MappedJdbcType base Value String
  • Maven - java.net.BindException:地址已在使用中

    我正在尝试在 Ubuntu 12 04 中运行以下命令 mvn jetty run 并收到以下错误 2013 09 04 13 21 32 843 WARN failed email protected cdn cgi l email pr
  • 基于另一个 Observable 的自定义过滤器的函数反应运算符

    为了好玩和学习 我尝试使用函数反应式编程在我的应用程序中实现撤消系统 我有一个状态更改流 需要将其保存到撤消堆栈中 当用户单击撤消时 我从堆栈中获取一个值并相应地更新应用程序状态 问题是此更新本身也会在状态更改流中生成一个事件 所以我想要的
  • 目前不存在哪些有用的 R 包? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • AVAudioPlayer:音量按钮在某些设备上有效,在其他设备上无效

    我有一个应用程序使用AVAudioPlayer播放一些嵌入的 MP3 文件 音量按钮在我主要用于测试的 3GS 上工作可靠 它们在 4 1 下工作 升级到 4 3 1 后现在可以工作 在我老板运行 4 2 1 的 iPhone 4 上 它们
  • 创建 XML 站点地图生成器 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想创建一个 XML 站点地图生成器 我有一个脚本 如果与其他文件一起放置在您的目录中 它会创建一个站点地图 但我想创建一个可以使用
  • 为r中的每个变量按组汇总表中的数据

    我有一些数据 我想用 R 中的一些汇总值正确格式化 我已经玩过aggregate和其他事情 例如summaryBy 但没有一个产生我想要的结果 这是数据 data lt data frame id c 1 2 3 4 5 6 7 8 9 1
  • android 无法从服务器加载图像

    在这里 我尝试从服务器下载图像 但它总是抛出异常 任何人都可以告诉我为什么会发生这种情况以及正确的方法是什么 public static String getBitmap String url throws IOException Inpu
  • 多个键名,相同的对值

    我正在尝试在 JavaScript 脚本中设置一个对象文字 该脚本具有具有多个名称的键 引用相同的对象值 即我已经尝试过的类似内容 var holidays thanksgiving day thanksgiving t day someV
  • 包装对象返回值(例如 Integer)是否会导致 Java 中的自动装箱?

    对于这个看似简单的问题 我找不到明确的答案 如果我写一个这样的方法 public Integer getAnInt int i 4 return i 0 返回值是否自动装箱为 Integer 还是取决于返回值后发生的情况 例如 分配给它的变
  • Python:UnboundLocalError:赋值之前引用的局部变量[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我在Pyt
  • 约束 wxPython MultiSplitterWindow 窗格

    Edit 我将问题保留原样 因为这仍然是一个好问题 而且答案可能对其他人有用 但是 我会注意到我找到了一个实际的解决方案my通过使用完全不同的方法来解决问题AuiManager 看到answer https stackoverflow co
  • 如何在 bazel 中生成 Python 覆盖率?

    我正在尝试在 bazel 中生成 Python 覆盖范围 我尝试运行此命令并生成了一个空文件 bazelisk coverage company libs foo test INFO Using default value for inst
  • 如何防止自定义 DialogFragment 在显示时隐藏键盘

    有 2 种方法可以通过以下方式创建自定义对话框DialogFragment 覆盖onCreateDialog并使用返回一个对话框AlertDialog Builder 覆盖onCreateView 我们注意到 如果我们覆盖onCreateD