Android软键盘状态弹出与消失的示例
程序员文章站
2023-12-21 10:11:25
最近遇到了关于软键盘的问题,需要获取到软键盘的状态,是否在显示 ,记录一下,方便以后查阅。网上常见的判定状态方法
复制代码 代码如下:
getwindow().ge...
最近遇到了关于软键盘的问题,需要获取到软键盘的状态,是否在显示 ,记录一下,方便以后查阅。网上常见的判定状态方法
复制代码 代码如下:
getwindow().getattributes().softinputmode== windowmanager.layoutparams.soft_input_state_unspecified
来判断软键盘是否打开,若相等则为打开。试了之后,发现这个只对手机自带的键盘有作用,对安装的第三方的输入法没有效果。
还有介绍使用inputmethodmanager 来获取键盘状态,代码如下
inputmethodmanager imm = (inputmethodmanager)getsystemservice(context.input_method_service); boolean isopen=imm.isactive();//isopen若返回true,则表示输入法打开
这种并不能实时获取到键盘的状态,对我依然没有效果。
后来找到的解决方法,监听屏幕的变化,代码如下:
import android.app.activity; import android.content.context; import android.graphics.rect; import android.os.build; import android.util.log; import android.util.typedvalue; import android.view.view; import android.view.viewgroup; import android.view.viewtreeobserver; /** * * 软键盘的监听 */ public class keyboardshowlistener { private context ctx; public keyboardshowlistener(context ctx) { this.ctx = ctx; } onkeyboardvisibilitylistener keyboardlistener; public onkeyboardvisibilitylistener getkeyboardlistener() { return keyboardlistener; } public interface onkeyboardvisibilitylistener { void onvisibilitychanged(boolean visible); } public void setkeyboardlistener(final onkeyboardvisibilitylistener listener, activity activity) { final view activityrootview = ((viewgroup) activity.findviewbyid(android.r.id.content)).getchildat(0); activityrootview.getviewtreeobserver().addongloballayoutlistener(new viewtreeobserver.ongloballayoutlistener() { private boolean wasopened; private final int defaultkeyboarddp = 100; // from @nathanielwolf answer... lollipop includes button bar in the root. add height of button bar (48dp) to maxdiff private final int estimatedkeyboarddp = defaultkeyboarddp + (build.version.sdk_int >= build.version_codes.lollipop ? 48 : 0); private final rect r = new rect(); @override public void ongloballayout() { // convert the dp to pixels. int estimatedkeyboardheight = (int) typedvalue .applydimension(typedvalue.complex_unit_dip, estimatedkeyboarddp, activityrootview.getresources().getdisplaymetrics()); // conclude whether the keyboard is shown or not. activityrootview.getwindowvisibledisplayframe(r); int heightdiff = activityrootview.getrootview().getheight() - (r.bottom - r.top); boolean isshown = heightdiff >= estimatedkeyboardheight; if (isshown == wasopened) { log.e("keyboard state", "ignoring global layout change..."); return; } wasopened = isshown; listener.onvisibilitychanged(isshown); } }); } }
用法如下:
//监听软键盘的状态 new keyboardshowlistener(activity.this).setkeyboardlistener( new keyboardshowlistener.onkeyboardvisibilitylistener() { @override public void onvisibilitychanged(boolean visible) { if (visible) { //软键盘已弹出 } else { //软键盘未弹出 } } }, activity.this);
以下是可能会遇到的一些情况:
绑定软键盘到edittext
edit.setfocusable(true); edit.setfocusableintouchmode(true); edit.requestfocus(); inputmethodmanager inputmanager = (inputmethodmanager)edit.getcontext().getsystemservice(context.input_method_service); inputmanager.showsoftinput(edit, 0);
去除软键盘显示:
editmsgview.settext(""); editmsgview.clearfocus(); //close inputmethodmanager inputmethodmanager imm = (inputmethodmanager)getsystemservice(context.input_method_service); imm.hidesoftinputfromwindow(editmsgview.getwindowtoken(), 0);
始终不弹出软件键盘
复制代码 代码如下:
edittext edit=(edittext)findviewbyid(r.id.edit); edit.setinputtype(inputtype.type_null);
也可以:
inputmethodmanager imm = (inputmethodmanager)v.getcontext().getsystemservice(context.input_method_service); if(imm.isactive()){ //这里可以判断也可以不判断 imm.hidesoftinputfromwindow(v.getapplicationwindowtoken(), 0 ); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。