Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理

Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理

目录

[Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理](#Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理)

一、简单介绍

二、现象描述

三、尝试的解决方案

[1、根据应用的需求 在 AndroidManifest.xml 配置 android:windowSoftInputMode](#1、根据应用的需求 在 AndroidManifest.xml 配置 android:windowSoftInputMode)

2、确保输入框获取焦点

[3、确保 TextField 的键盘调用逻辑正确。可以通过手动调用键盘弹出和隐藏的方法来确保键盘能够正确弹出 尝试](#3、确保 TextField 的键盘调用逻辑正确。可以通过手动调用键盘弹出和隐藏的方法来确保键盘能够正确弹出 尝试)

[4、焦点管理对于键盘弹出至关重要。通过以下方式确保焦点正确管理 尝试](#4、焦点管理对于键盘弹出至关重要。通过以下方式确保焦点正确管理 尝试)

[5、在 TextField 的 onTap 事件中手动触发键盘弹出 尝试](#5、在 TextField 的 onTap 事件中手动触发键盘弹出 尝试)

[6、最后的尝试的解决的方式是在 LauncherManifest.xml 进行配置](#6、最后的尝试的解决的方式是在 LauncherManifest.xml 进行配置)


一、简单介绍

Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。

Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素,从而创建自定义的、适应性强的设计,这些设计在任何屏幕上都能呈现出色的外观和感觉。

二、现象描述

环境与操作说明:

1、使用 Flutter 进行 module 相关页面的开发,其中,里面涉及到 TextField 交互,唤起输入法软键盘的操作,

2、然后 aar 集成到 Android 上,在 Android Studio 上进行相关的开发,

3、最后,在 aar 集成到 Unity,在 Unity 上进行打包

问题现象描述:

1、进行 Flutter 和 Android 端打包测试 使用 TextField 可以正常的进行 输入法软键盘 的唤起;

2、在集成到 Unity 上进行打包测试,使用 TextField 交互的时候,在华为的一些手机上没有立即弹出 输入法软键盘

三、尝试的解决方案(仅供参考,具体问题具体分析)

1、根据应用的需求 在 AndroidManifest.xml 配置 android:windowSoftInputMode

html 复制代码
<activity
    android:name=".YourActivity"
    android:windowSoftInputMode="stateHidden|adjustResize">
</activity>
  • stateVisible:软键盘默认可见。

  • adjustResize:当软键盘弹出时,调整布局大小

后来,发现使用 Unity 打的包依然,没有能够唤起输入法软键盘

最后添加

XML 复制代码
<activity android:name=".YourActivity"
               android:exported="true" android:launchMode="singleTop" android:configChanges="locale|keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|density|layoutDirection|fontScale" android:windowSoftInputMode="adjustResize" android:hardwareAccelerated="true"
              android:theme="@style/UnityThemeSelector">

上面代码定义了一个 Android 应用中的 <activity> 元素,用于配置一个具体的活动(Activity)。以下是每个属性的详细解释:

  1. android:name
  • 含义:指定活动的完整类名。

  • com.rayneo.adapter.MainActivity

    这表示该活动的类名为 MainActivity,位于 com.rayneo.adapter 包中。

  1. android:exported
  • 含义:是否允许其他应用或组件启动该活动。

  • true

    表示其他应用可以通过意图(Intent)启动这个活动。如果设置为 false,则只有在同一应用内部才能启动该活动。

  1. android:launchMode
  • 含义:定义活动的启动模式,控制活动在任务栈中的行为。

  • singleTop

    • singleTop :如果活动已经位于任务栈的顶部,再次启动该活动时不会创建新的实例,而是调用 onNewIntent() 方法。

    • 其他可能的值:

      • standard:每次启动都会创建新的实例。

      • singleTask:在任务栈中只保留一个实例,如果活动已经存在,则将该活动移到栈顶。

      • singleInstance:活动单独运行在一个任务栈中,不会与其他活动共享任务栈。

  1. android:configChanges
  • 含义:声明活动可以处理的配置变化,避免因配置变化(如屏幕旋转、语言切换等)导致活动被销毁和重新创建。

  • locale|keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|density|layoutDirection|fontScale

    • locale:语言或地区变化。

    • keyboard:键盘类型变化。

    • keyboardHidden:键盘隐藏或显示。

    • orientation:屏幕方向变化(横屏或竖屏)。

    • screenLayout:屏幕布局变化。

    • uiMode:UI 模式变化(如夜间模式)。

    • screenSize:屏幕尺寸变化。

    • smallestScreenSize:最小屏幕尺寸变化。

    • density:屏幕密度变化。

    • layoutDirection:布局方向变化(如从左到右或从右到左)。

    • fontScale:字体缩放变化。

  1. android:windowSoftInputMode
  • 含义:定义软键盘的显示和调整行为。

  • adjustResize

    • adjustResize:当软键盘显示时,活动的布局会自动调整大小,以确保内容不会被软键盘遮挡。

    • 其他可能的值:

      • adjustPan:当软键盘显示时,活动的布局会自动向上平移,以确保当前焦点控件不会被遮挡。

      • stateAlwaysHidden:软键盘默认隐藏。

      • stateAlwaysVisible:软键盘默认显示。

  1. android:hardwareAccelerated
  • 含义:是否启用硬件加速。

  • true

    表示启用硬件加速,可以提高图形渲染性能,但可能会增加内存消耗。

  1. android:theme
  • 含义:指定活动的主题样式。

  • @style/UnityThemeSelector

    这是一个资源引用,指向 styles.xml 文件中定义的 UnityThemeSelector 样式。主题定义了活动的外观和行为,例如窗口背景、按钮样式等。

总结

这段代码定义了一个名为 com.rayneo.adapter.MainActivity 的活动,配置了以下行为:

  • 允许从外部启动。

  • 使用 singleTop 启动模式,避免重复创建实例。

  • 可以处理多种配置变化,避免因配置变化导致活动被销毁和重建。

  • 软键盘显示时会调整布局大小。

  • 启用硬件加速以提高性能。

  • 使用 UnityThemeSelector 主题样式。

2、 确保输入框获取焦点

在代码中,确保输入框(EditText)能够正确获取焦点。可以通过以下方式强制获取焦点并弹出软键盘:

java 复制代码
EditText editText = findViewById(R.id.your_edit_text);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

如果输入框在 Dialog 中,可以在 Dialog 显示后弹出软键盘

java 复制代码
dialog.setOnShowListener(dialogInterface -> {
    EditText editText = dialog.findViewById(R.id.your_edit_text);
    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
});

然后,可以使用 MethodChanel 的方式,在 Flutter 的 TextField 点击的时候进行调用

3、确保 TextField 的键盘调用逻辑正确。可以通过手动调用键盘弹出和隐藏的方法来确保键盘能够正确弹出 尝试

Dart 复制代码
// 弹出键盘
SystemChannels.textInput.invokeMethod('TextInput.show');

// 隐藏键盘
SystemChannels.textInput.invokeMethod('TextInput.hide');

4、焦点管理对于键盘弹出至关重要。通过以下方式确保焦点正确管理 尝试

Dart 复制代码
FocusNode focusNode = FocusNode();

focusNode.addListener(() {
  if (focusNode.hasFocus) {
    // 强制弹出键盘
    SystemChannels.textInput.invokeMethod('TextInput.show');
  }
});

TextField(
  focusNode: focusNode,
)

5、在 TextFieldonTap 事件中手动触发键盘弹出 尝试

Dart 复制代码
TextField(
  onTap: () {
    FocusScope.of(context).unfocus();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      focusNode.requestFocus();
    });
  },
  focusNode: focusNode,
)

6、最后的尝试的解决的方式是在 LauncherManifest.xml 进行配置

LauncherManifest.xml 文件通常是一个配置文件,用于定义某些应用程序或系统组件的启动器(Launcher)相关设置。

XML 复制代码
<supports-screens
    android:smallScreens="true"
    android:normalScreens="true"
    android:largeScreens="true"
    android:xlargeScreens="true"
    android:anyDensity="true"/>

<supports-screens> 标签

这是一个用于声明应用支持的屏幕尺寸和密度的标签。它可以帮助系统在不同设备上更好地适配应用,或者限制应用在某些不支持的设备上安装。

属性解释

  1. android:smallScreens="true"

    • 表示应用支持小尺寸屏幕设备。

    • 小尺寸屏幕通常是指屏幕对角线小于 4.7 英寸的设备。

  2. android:normalScreens="true"

    • 表示应用支持普通尺寸屏幕设备。

    • 普通尺寸屏幕通常是指屏幕对角线在 4.7 英寸到 6.0 英寸之间的设备。

  3. android:largeScreens="true"

    • 表示应用支持大尺寸屏幕设备。

    • 大尺寸屏幕通常是指屏幕对角线在 6.0 英寸到 7.0 英寸之间的设备。

  4. android:xlargeScreens="true"

    • 表示应用支持超大尺寸屏幕设备。

    • 超大尺寸屏幕通常是指屏幕对角线大于 7.0 英寸的设备,例如平板电脑。

  5. android:anyDensity="true"

    • 表示应用支持所有屏幕密度。

    • 屏幕密度是指屏幕的像素密度,例如低密度(ldpi)、中密度(mdpi)、高密度(hdpi)、超高密度(xhdpi)等。

    • 设置为 true 表示应用可以自动适配不同密度的屏幕,系统会根据设备的屏幕密度选择合适的资源(如图片、布局等)。

作用

  • 兼容性 :通过设置这些属性,应用可以明确支持哪些类型的设备。如果某些属性设置为 false,应用将不会在不支持的设备上安装。

  • 资源适配android:anyDensity="true" 确保应用可以根据设备的屏幕密度选择合适的资源,从而在不同设备上提供更好的用户体验。

其中,经过测试,最终生效,成功换出输入法软键盘 的关键配置是 :

android:anyDensity="true"

相关推荐
leluckys3 小时前
flutter 专题 六十四 在原生项目中集成Flutter
flutter
leluckys3 小时前
flutter 专题 一百零四 Flutter环境搭建
flutter
唯鹿3 小时前
AI生成Flutter UI代码实践(一)
人工智能·flutter·ui
leluckys6 小时前
flutter 专题 五十八 关于Flutter提示Your Xcode project requires migration的错误
flutter
米芝鱼7 小时前
Unity URPShader:实现和PS一样的色相/饱和度调整参数效果(修复)
游戏·unity·游戏引擎·图形渲染·opengl·着色器
scott.cgi10 小时前
「Unity3D」TextMeshPro使用TMP_InputField实现,输入框高度自动扩展与收缩
unity·ugui·textmeshpro·tmp_inputfield·inputfield高度自动化·unity输入框高度扩展·textmeshpro高度扩展
只可远观18 小时前
Flutter Dart中的函数参数 默函数的定义 可选参数 箭头函数 匿名函认参数 命名参类数 闭包等
windows·flutter
大飞pkz1 天前
【Unity】MVC的简单分享以及一个在UI中使用的例子
unity·c#·mvc·框架·ui框架·商业级ui框架
Tatalaluola1 天前
unity在编辑器模式调试音频卡顿电流声
unity·游戏引擎