Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理
Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理
目录
Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理
一、简单介绍
二、现象描述
三、尝试的解决方案
1、根据应用的需求 在 AndroidManifest.xml 配置 android:windowSoftInputMode
2、确保输入框获取焦点
3、确保 TextField 的键盘调用逻辑正确。可以通过手动调用键盘弹出和隐藏的方法来确保键盘能够正确弹出 尝试
4、焦点管理对于键盘弹出至关重要。通过以下方式确保焦点正确管理 尝试
5、在 TextField 的 onTap 事件中手动触发键盘弹出 尝试
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
<activityandroid:name=".YourActivity"android:windowSoftInputMode="stateHidden|adjustResize">
</activity>
stateVisible
:软键盘默认可见。
adjustResize
:当软键盘弹出时,调整布局大小
后来,发现使用 Unity 打的包依然,没有能够唤起输入法软键盘
最后添加
<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
包中。2.
android:exported
含义:是否允许其他应用或组件启动该活动。
值:
true
表示其他应用可以通过意图(Intent)启动这个活动。如果设置为false
,则只有在同一应用内部才能启动该活动。3.
android:launchMode
含义:定义活动的启动模式,控制活动在任务栈中的行为。
值:
singleTop
singleTop
:如果活动已经位于任务栈的顶部,再次启动该活动时不会创建新的实例,而是调用onNewIntent()
方法。其他可能的值:
standard
:每次启动都会创建新的实例。
singleTask
:在任务栈中只保留一个实例,如果活动已经存在,则将该活动移到栈顶。
singleInstance
:活动单独运行在一个任务栈中,不会与其他活动共享任务栈。4.
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
:字体缩放变化。5.
android:windowSoftInputMode
含义:定义软键盘的显示和调整行为。
值:
adjustResize
adjustResize
:当软键盘显示时,活动的布局会自动调整大小,以确保内容不会被软键盘遮挡。其他可能的值:
adjustPan
:当软键盘显示时,活动的布局会自动向上平移,以确保当前焦点控件不会被遮挡。
stateAlwaysHidden
:软键盘默认隐藏。
stateAlwaysVisible
:软键盘默认显示。6.
android:hardwareAccelerated
含义:是否启用硬件加速。
值:
true
表示启用硬件加速,可以提高图形渲染性能,但可能会增加内存消耗。7.
android:theme
含义:指定活动的主题样式。
值:
@style/UnityThemeSelector
这是一个资源引用,指向styles.xml
文件中定义的UnityThemeSelector
样式。主题定义了活动的外观和行为,例如窗口背景、按钮样式等。总结
这段代码定义了一个名为
com.rayneo.adapter.MainActivity
的活动,配置了以下行为:
允许从外部启动。
使用
singleTop
启动模式,避免重复创建实例。可以处理多种配置变化,避免因配置变化导致活动被销毁和重建。
软键盘显示时会调整布局大小。
启用硬件加速以提高性能。
使用
UnityThemeSelector
主题样式。
2、确保输入框获取焦点
在代码中,确保输入框(EditText
)能够正确获取焦点。可以通过以下方式强制获取焦点并弹出软键盘:
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
显示后弹出软键盘
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
的键盘调用逻辑正确。可以通过手动调用键盘弹出和隐藏的方法来确保键盘能够正确弹出 尝试
// 弹出键盘
SystemChannels.textInput.invokeMethod('TextInput.show');// 隐藏键盘
SystemChannels.textInput.invokeMethod('TextInput.hide');
4、焦点管理对于键盘弹出至关重要。通过以下方式确保焦点正确管理 尝试
FocusNode focusNode = FocusNode();focusNode.addListener(() {if (focusNode.hasFocus) {// 强制弹出键盘SystemChannels.textInput.invokeMethod('TextInput.show');}
});TextField(focusNode: focusNode,
)
5、在 TextField
的 onTap
事件中手动触发键盘弹出 尝试
TextField(onTap: () {FocusScope.of(context).unfocus();WidgetsBinding.instance.addPostFrameCallback((_) {focusNode.requestFocus();});},focusNode: focusNode,
)
6、最后的尝试的解决的方式是在 LauncherManifest.xml 进行配置
LauncherManifest.xml
文件通常是一个配置文件,用于定义某些应用程序或系统组件的启动器(Launcher)相关设置。
<supports-screensandroid:smallScreens="true"android:normalScreens="true"android:largeScreens="true"android:xlargeScreens="true"android:anyDensity="true"/>
<supports-screens>
标签这是一个用于声明应用支持的屏幕尺寸和密度的标签。它可以帮助系统在不同设备上更好地适配应用,或者限制应用在某些不支持的设备上安装。
属性解释
android:smallScreens="true"
表示应用支持小尺寸屏幕设备。
小尺寸屏幕通常是指屏幕对角线小于 4.7 英寸的设备。
android:normalScreens="true"
表示应用支持普通尺寸屏幕设备。
普通尺寸屏幕通常是指屏幕对角线在 4.7 英寸到 6.0 英寸之间的设备。
android:largeScreens="true"
表示应用支持大尺寸屏幕设备。
大尺寸屏幕通常是指屏幕对角线在 6.0 英寸到 7.0 英寸之间的设备。
android:xlargeScreens="true"
表示应用支持超大尺寸屏幕设备。
超大尺寸屏幕通常是指屏幕对角线大于 7.0 英寸的设备,例如平板电脑。
android:anyDensity="true"
表示应用支持所有屏幕密度。
屏幕密度是指屏幕的像素密度,例如低密度(ldpi)、中密度(mdpi)、高密度(hdpi)、超高密度(xhdpi)等。
设置为
true
表示应用可以自动适配不同密度的屏幕,系统会根据设备的屏幕密度选择合适的资源(如图片、布局等)。作用
兼容性:通过设置这些属性,应用可以明确支持哪些类型的设备。如果某些属性设置为
false
,应用将不会在不支持的设备上安装。资源适配:
android:anyDensity="true"
确保应用可以根据设备的屏幕密度选择合适的资源,从而在不同设备上提供更好的用户体验。
其中,经过测试,最终生效,成功换出输入法软键盘 的关键配置是 :
android:anyDensity="true"