我从这里开始关注"避免内存泄漏"一文.
然而,所提出的解决方案不能解决泄漏问题.我在Windows XP(SDK 2.3.1)上使用Android模拟器测试了这个.我倾倒堆并检查主要活动仍在堆中(我使用了MAT)
这是我做的:
HelloWorldActivity < - PhoneWindow $ DecorView < - InputMethodManager
InputMethodManager是一个单例和三个引用DecorView的引用,它引用了HelloWorldActivity.
我无法理解为什么InputMethodManager仍然引用DecorView实例,即使在活动被销毁之后.
是否有任何方法可以确保主要活动在关闭之后被销毁并且GC能够?
android garbage-collection android-activity inputmethodmanager
这InputMethodManager是一种应用程序可用于与系统键盘交互的服务.编辑EditText也喜欢用它来间接通知键盘变化(例如updateSelection).
我可以参考InputMethodManager这个
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
Run Code Online (Sandbox Code Playgroud)
我的问题是,这似乎只适用于系统键盘.我可以使用InputMethodManager一个自定义应用程序内的键盘?如果只是一个孤立的应用程序我不在乎,但我在一个库中包括一个将在许多应用程序中使用的自定义键盘.我需要一种标准的方式让编辑器与键盘进行通信.
我是否必须编写自己的输入法管理器,或者是否有办法在InputMethodManager我的自定义应用内键盘中使用该标准?
更新
以下是一些线索,说明如果无法使用标准输入法管理器,我将如何实现自己的自定义输入法管理器.
InputMethodManager(文件)(源代码)InputMethod 接口InputMethodSession 接口KeyboardView.OnKeyboardActionListener界面(键盘实现它)InputMethodService(键盘扩展此)(文档)(源代码)我试图使用以下代码隐藏用户单击按钮时的软键盘:
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
InputMethodManager未定义
我想我需要添加一个import语句?如果是这样,有谁知道什么?或者我该如何解决这个问题?
showSoftInputFromInputMethod该类中的方法在InputMethodManagerAndroid P 中已弃用。根据文档,我们应该InputMethodService.requestShowSelf(int)在 Android P 及更高版本中使用该方法。
现在的问题是我们如何获得该类的参考InputMethodService。我尝试创建一个新对象并调用requestShowself()它,但它不起作用。
InputMethodService inputMethodService = new InputMethodService();
inputMethodService.requestShowSelf(0);
Run Code Online (Sandbox Code Playgroud)
我们如何使用建议的替代方案来替代 API 28 及更高版本的弃用?
android android-keypad android-input-method inputmethodmanager android-9.0-pie
我的应用程序在很多设备上运行良好。但自从在我自己的 Pixel 上升级到 Android 12 后,在调用 showSoftInput 或点击 Bottomsheet 中的 AppCompatEditText 时,会发生以下情况。
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager;
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
Run Code Online (Sandbox Code Playgroud)
Logcat 警告(应用程序中没有任何反应):
Ignoring showSoftInput() as view=androidx.appcompat.widget.AppCompatEditText{b5311a0 VFED..CL. .F.P..ID 84,0-996,118 #7f0900a7 app:id/et_bottomsheet aid=1073741827} is not served.
Run Code Online (Sandbox Code Playgroud)
我尝试了很多方法,例如请求焦点、使用 SHOW_FORCE 的 showSoftInput 但没有任何效果。
android android-appcompat android-edittext inputmethodmanager