如何获取android的软键盘的显示状态

如何获取android的软键盘的显示状态,第1张

最近项目中有一个编辑框,下面是个ListView。在触发编辑框d出键盘后,ListView还能滑动,并且ListView的item还能响应单击。这样的体验效果很不好。于是便想在滑动或单击item时判断键盘是否d出,若d出,则把它隐藏。

网上一搜,发现Android并没有直接提供软键盘的d出与隐藏判断,一些解决方案诸如判断父控件的高度或者判断

12

if(getWindow()getAttributes()softInputMode==WindowManagerLayoutParamsSOFT_INPUT_STATE_HIDDEN) 隐藏键盘;

的方法并没有用,于是便从官方文档着手。

发现InputMethodManager有一个方法isActive(View view):如果view是输入法的活动view,则返回true。也就是说,如果是由view触发d出软键盘,则返回true。哇,那问题就好办了

12

if(isActive(edittext)) 隐藏键盘

接着让另一个view强制获取焦点,这样isActivite(ediitext)就为false

这个方法比较简单,代码比较短,也很好理解,希望能够帮助有需要的人,也不枉费我调试几个小时的功夫。

附上代码:

12345678

InputMethodManager inputMethodManager = (InputMethodManager)getActivity()getSystemService(ContextINPUT_METHOD_SERVICE);<br>private boolean hideKeyboard(){ if(inputMethodManagerisActive(searchEditText)){<br>//因为是在fragment下,所以用了getView()获取view,也可以用findViewById()来获取父控件 getView()requestFocus();//使其它view获取焦点这里因为是在fragment下,所以便用了getView(),可以指定任意其它view inputMethodManagerhideSoftInputFromWindow(getActivity()getCurrentFocus()getWindowToken(), InputMethodManagerHIDE_NOT_ALWAYS); return true; } return false; }

ps:如果是手动d出键盘,getActivity()getCurrentFocus()改成searchEditText并且手动d出的键盘isActivie()失效,可用标记来判断

我们目前的项目是采用单 Activity 多 Fragment 的架构模式, AndroidManifestxml 内 MainActivity 的配置如下所示。

stateHidden

状态隐藏,如果我们设置了这个属性,键盘状态就一定是隐藏的,不管上个界面是什么状态,也不管当前界面有没有输入的需求,就是不显示软键盘。

adjustResize

调整大小状态,这个属性表示 Activity 的主窗口总是会被调整大小来保证软键盘的显示空间。如果界面中有可滑动控件,显示效果跟 adjustUnspecified 显示效果一样;如果界面中没有可滑动控件,软键盘可能会盖住一些控件(布局的位置不会发生变化,可能获取了焦点的控件被软键盘盖住)。

一般来说,我们的布局分为两种

第一种布局是不会出现软键盘把底部按钮顶起的情况,首先软键盘的打开实际上是一个 Dialog,而我们在配置文件内的 adjustResize 属性是在页面的根布局 decorView 的子 view 也就是一个线性布局内通过设置 paddingBottom = 软键盘高度,这样其实相当于把整个滚动布局的高度减少了,所以底部的按钮也只是变为需要滚动才能看到。

第二种情况通常为一个继续按钮始终处于页面的底部,中间的内容可以滚动,当根布局的内边距等于软键盘高度时,底部按钮就看起来像是被顶起。

1、监听软键盘的打开收起

2、修改 windowSoftInputMode

adjustPan

如果设置了这个属性,当软键盘d出的时候,系统会通过布局的移动,来保证用户要进行输入的输入框在用户的视线范围内。如果界面没有可滑动控件,显示效果和 adjustUnspecified 效果一样;如果界面有可滑动控件,在软键盘显示的时候,可能会有一些内容显示不出来。

资料借鉴

Android中Activity的android:windowSoftInputMode属性

    总结:

    1在ios中软键盘d起时,仅会引起body的scrollTop值改变,但是我们可以通过输入框的获取焦点情况来做判断,单也只能在ios中采用这个方案,因为在android中存在主动受气键盘后,但输入框并没有失去焦点,而ios中键盘受气后就会失去焦点;

2在androis中软键盘d起或收起时,会改变window的高度,因此监听window的onresize事件;

一、Android

//获取原窗口的高度

var originalHeight=documentdocumentElementclientHeight ||documentbodyclientHeight;

windowonresize=function(){

    //键盘d起与隐藏都会引起窗口的高度发生变化

      var resizeHeight=documentdocumentElementclientHeight || documentbodyclientHeight;

        if(resizeHeight-0<originalHeight-0){

        //当软键盘d起,在此处 *** 作

        }else{

        //当软键盘收起,在此处 *** 作

        }

}

二、ios

focusin和focusout支持冒泡,对应focus和blur, 使用focusin和focusout的原因是focusin和focusout可以冒泡,focus和blur不会冒泡,这样就可以使用事件代理,处理多个输入框存在的情况。

documentbodyaddEventListener('focusin', () => {

            //软键盘d出的事件处理

            if(isIphone()){

            }

        })

  documentbodyaddEventListener('focusout', () => {

      //软键盘收起的事件处理

        if(isIphone()){

        }

  })

特此声明文章出处: >

在进行聊天界面开发的时候,发现安卓手机键盘会把界面顶起,但是不会收回来,在网上找到了这个方法解决

之前我是在mounted中根据documentactiveElementtagName的值判断是否为INPUT去改变键盘d起的高度

但是在下方加了一个按钮之后,发现点击语音按钮后再切换到输入框,

documentactiveElementtagName的值变成BODY了,查找资料发现

所以此方法在点击语音后再也调用不起来,困扰了一天的问题,记录一下

原因:在flutter中,键盘d起时系统会缩小Scaffold的高度并重建

1)把Scaffold的resizeToAvoidBottomInset属性设置为false,这样在键盘d出时将不会resize

2)把写死的高度改为 原高度 - MediaQueryof(context)viewInsetsbottom ,键盘d出时布局将重建,而这个 MediaQueryof(context)viewInsetsbottom 变量在键盘d出前是0,键盘d起后的就是键盘的高度

将输入框放进可滚动的Widget中即可,当输入框获取焦点后,系统会自动将它滑动到可视区域

vant顶部导航栏撑不开盒子,可以这样解决问题:

1控制盒子的显示与隐藏,

2记录手机的高度,

3记录软键盘d出后,当前屏幕的高度,当调用软键盘后,屏幕的高度会发生改变,屏幕的高度会等于(手机原始高度-软键盘的高度))。

在Android和 IOS 上,获知软键盘d起和收起状态存在差异,事件不同。

在IOS上,输入框获取焦点,键盘d起,页面(webview)整体往上滚动,当键盘收起后,不回到原位,导致键盘原来所在位置是空白的。使用第三方输入法,高度计算存在偏差,导致在有些输入法d起,将输入框挡住一部分。

ios的软键盘d起的时候是整个页面网上滚的,scrollTop发生变化的高度就是软键盘的高度,但是在软键盘收起的时候这段距离并不会收回

Android上,软键盘被d起的时候,整个页面会被压缩,准确的来说是视图会被压缩,之前高度减去d起后的高度是软键盘的高度

并且在点击软键盘的收起的时候软键盘的input不会失去焦点

所以总结如下: 在IOS上,可以监听 聚焦和失焦事件来判断键盘的状态 在Android上,监听 页面高度变化可以判断键盘的状态

以上就是关于如何获取android的软键盘的显示状态全部的内容,包括:如何获取android的软键盘的显示状态、Android 底部按钮被软键盘顶起问题解决、H5如何对android和ios手机软键盘的监听等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9498182.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存