当前位置: 首页 > 编程笔记 >

Android监听软键盘弹出与隐藏的两种方法

农永宁
2023-03-14
本文向大家介绍Android监听软键盘弹出与隐藏的两种方法,包括了Android监听软键盘弹出与隐藏的两种方法的使用技巧和注意事项,需要的朋友参考一下

需求:

现在有一个需求是点击一行文本框,弹出一个之前隐藏的输入框,输入完成后按返回键或者其他的东西隐藏键盘和输入框,将输入框的内容填充到文本框中。

实现:

拿到这个需求的第一反应就是写一个监听来监听键盘的显示和隐藏来控制输入框的显示和隐藏,控制文本框中的内容。
所以我做了如下操作:

  1. 指定android:windowSoftInputMode="adjustResize|stateAlwaysHidden"这个的做法是为了让键盘弹出时改变布局。
  2. 让Activity实现LayoutchangeListener,监听布局的改变,当布局发生的改变为屏幕的1/3时我们认为是键盘导致的。
@Override 
 html" target="_blank">public void onLayoutChange(View v, int left, int top, int right, 
     int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 

   //old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值 

   //现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起 
   if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){ 

     Toast.makeText(MainActivity.this, "监听到软键盘弹起...", Toast.LENGTH_SHORT).show(); 

   }else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){ 

     Toast.makeText(MainActivity.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show(); 

   } 

 }

问题:

没错,这样确实是能够做到监听软键盘的弹出和隐藏,这一切都是因为之前设置了indowSoftInputMode=adjustResize,但是当全屏模式下是这个属性是无效的,键盘弹出和隐藏并不会触发onLayouChangeListener。

而项目中使用了SystemBarTintManager之后,Activity就变成了全屏模式所以我做了如下操作

//contentlayout是最外层布局
mChildOfContent = contentlayout.getChildAt(0);
mChildOfContent.getViewTreeObserver()
.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
   public void onGlobalLayout() {    
       possiblyResizeChildOfContent();  
}});

private void possiblyResizeChildOfContent() {  
int usableHeightNow = computeUsableHeight();  
if (usableHeightNow != usableHeightPrevious) {    
   int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();    
   int heightDifference = usableHeightSansKeyboard - usableHeightNow;    
   if (heightDifference > (usableHeightSansKeyboard / 4)) {      
   // 键盘弹出    
   } else {      
   // 键盘收起      
   productInfo.setVisibility(View.GONE);      
   productInfoEnd.setText(productInfo.getText().toString());    
}    
   mChildOfContent.requestLayout();    
    usableHeightPrevious = usableHeightNow;  
}
}
private int computeUsableHeight() {  
 Rect r = new Rect();  
mChildOfContent.getWindowVisibleDisplayFrame(r);  
return (r.bottom - r.top);}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 我有一个AutoCompleteTextView,它像往常一样在用户键入3个字母后提供建议。一旦我触摸建议列表,我想隐藏软键盘一次。我在下面用表格布局所做的只是在单击除建议列表之外的任何地方时隐藏键盘。 可扩展置标语言 爪哇岛 用于自定义列表的 XML

  • 本文向大家介绍Android App实现监听软键盘按键的三种方式,包括了Android App实现监听软键盘按键的三种方式的使用技巧和注意事项,需要的朋友参考一下 前言: 我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“Go”按键加载url页面;在点击搜索框的时候,点击右下角的search符号键可以进行搜索;或者在全部数据

  • 我需要隐藏软键盘以响应单击按钮。我看到了一些关于这方面的帖子,我尝试了: 这很有效。但现在我有两个EditText视图。无论选择了哪个EditText,现在如何隐藏软键盘?我也试过了 ,但那不起作用... 谢谢你的帮助! 编辑:找到解决方案。贴在下面。

  • 我试图防止在SearchView上调用requestFocus()后键盘出现,但在Android8上没有解决方案。 我试过: /*3/ /*4/ onGlobalLayout()工作,但软键盘显示了近0.5秒后消失。 即使在调用requestFocus()之后,是否可以帮助隐藏软键盘?

  • 使用操作栏导航加载第二个片段后 重新加载另一个片段,动作栏仍然是visibile 我用一个测试项目用最小的代码加载片段,行为是一样的,分裂条被软键盘隐藏。我怎样才能使它从一开始就显示拆分条?

  • 本文向大家介绍总结IOS中隐藏软键盘的三种方式,包括了总结IOS中隐藏软键盘的三种方式的使用技巧和注意事项,需要的朋友参考一下 一、使用软键盘的 Done 键隐藏键盘 出发软键盘隐藏最常用的事件是文本框的 Did End on Exit,它在用户按软键盘中的 Done 键时发生。选中一个UITextField控件,点击鼠标右键弹出面板,鼠标左键按住 Did End on Exit 事件旁边的圆圈,