解决基于SlidingMenu的fragment切换后edittext无法获取焦点的问题

现象:在slidingmenu样式的主界面点击搜索框后,跳到新的fragment。新的fragment中有edittext搜索框,问题:调用requestFocus()后无法获取焦点,在Android系统3.0之前的机型出现无法输入的问题。无论怎么点击输入框,也无法激活,尽管可以看到输入光标在输入框上闪动。

该问题为什么出现在3.0以下的机型。猜想:由于这些机型使用的是android-suport-v4的包,才得以兼容运行fragment,可能这个包在解决这个问题上与系统耦合不够好。

最开始想到的解决办法:

由于edittext只有在它的view被创建之后才能获取焦点,否则调用showSoftInput(),toggleSoftInput()都是无效的。所以尝试使用handler的postDelayed(),500毫秒后调用

inputMethodManager的showSoftInput方法。尝试无果。

第二次尝试:

观察到一个现象,点击通知栏后,再点击edittext后就能输入内容了,也就是说当焦点转移到系统上,再从系统转回来的时候,焦点找回来了,于是猜想可能当我从fragmentA切到fragmentB的时候,焦点任然在当前的Activity的FragmentA中。也就是说我调用的edittext.requestFocus(),并没有把焦点转移到当前的fragment中。问题就出来edittext.requestFocus(),requestFocus()最开始是在oncreateView()中调用的,这个时候edittext可能还没有完全绘制完成。于是尝试放到当前的Fragment的OnResume()方法中。问题得到了解决。


中间还有更细的分析过程,和猜想步骤,此处省略500字。


关于imm的两种弹起方式

imm.showSoftInput()

imm.toggleSoftInput(),前者需要指明弹起还是关闭,后者不关心当前的状态,当前状态为开启,动作则为关闭;当前状态关闭,则为弹起。

设置InputMethodManager.SHOW_FOCED后,再调用SHOW_IMPLICIT有时候会出现无法弹起的现象。


开发太紧就草草记一记吧。

原文地址:https://www.cnblogs.com/ameryzhu/p/6555623.html