Android之监听手机软键盘弹起与关闭

简介:

背景:

在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹起与关闭。


预备知识:

在manifest文件中可以设置Activity的android:windowSoftInputMode属性,这个属性值常见的设置如下:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

那么这里值的含义列表如下:

 

【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示

【C】stateHidden:用户选择activity时,软键盘总是被隐藏

【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

【E】stateVisible:软键盘通常是可见的

【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间

【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分



示例:

(1)首先我们需要将监听所在的Activity在Manifest文件中的设置为如下形式:

 

[html]  view plain  copy
  1. <activity  
  2.     android:name="com.bear.softkeyboardlistener.MainActivity"  
  3.     android:label="@string/app_name"  
  4.     android:windowSoftInputMode="stateAlwaysHidden|adjustResize" >  
  5.     <intent-filter>  
  6.         <action android:name="android.intent.action.MAIN" />  
  7.   
  8.         <category android:name="android.intent.category.LAUNCHER" />  
  9.     </intent-filter>  
  10. </activity>  


这样设置之后,当有软键盘弹起来的时候,Activity的布局大小会被压缩上去,但是你仍然可以通过滑动浏览所有。


(2)我们要为Activity的最外面的Layout设置一个OnLayoutChangeListener监听器:

 

[java]  view plain  copy 在CODE上查看代码片派生到我的代码片
    1. import com.bear.bearbroadcastreceiver.R;  
    2.   
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5. import android.view.View;  
    6. import android.view.View.OnLayoutChangeListener;  
    7. import android.widget.Toast;  
    8.   
    9. public class MainActivity extends Activity implements OnLayoutChangeListener{  
    10.       
    11.     //Activity最外层的Layout视图  
    12.     private View activityRootView;  
    13.     //屏幕高度  
    14.     private int screenHeight = 0;  
    15.     //软件盘弹起后所占高度阀值  
    16.     private int keyHeight = 0;  
    17.       
    18.     @Override  
    19.     protected void onCreate(Bundle savedInstanceState) {  
    20.         super.onCreate(savedInstanceState);  
    21.         setContentView(R.layout.activity_main);  
    22.   
    23.         activityRootView = findViewById(R.id.root_layout);  
    24.         //获取屏幕高度  
    25.         screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();  
    26.         //阀值设置为屏幕高度的1/3  
    27.         keyHeight = screenHeight/3;  
    28.     }  
    29.       
    30.     @Override  
    31.     protected void onResume() {  
    32.         super.onResume();  
    33.           
    34.         //添加layout大小发生改变监听器  
    35.         activityRootView.addOnLayoutChangeListener(this);  
    36.     }  
    37.       
    38.     @Override  
    39.     public void onLayoutChange(View v, int left, int top, int right,  
    40.             int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {  
    41.           
    42.         //old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值  
    43.           
    44. //      System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);  
    45. //      System.out.println(left + " " + top +" " + right + " " + bottom);  
    46.           
    47.           
    48.         //现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起  
    49.         if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){  
    50.               
    51.             Toast.makeText(MainActivity.this, "监听到软键盘弹起...", Toast.LENGTH_SHORT).show();  
    52.           
    53.         }else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){  
    54.               
    55.             Toast.makeText(MainActivity.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show();  
    56.           
    57.         }  
    58.           
    59.     } 



    本文转自 一点点征服   博客园博客,原文链接: http://www.cnblogs.com/ldq2016/p/5777435.html ,如需转载请自行联系原作者


相关文章
|
20天前
|
安全 搜索推荐 Android开发
Android vs. iOS:解锁智能手机操作系统的奥秘####
【10月更文挑战第21天】 在当今这个数字化时代,智能手机已成为我们生活中不可或缺的伙伴。本文旨在深入浅出地探讨两大主流操作系统——Android与iOS的核心差异、优势及未来趋势,帮助读者更好地理解这两个平台背后的技术哲学和用户体验设计。通过对比分析,揭示它们如何塑造了我们的数字生活方式,并展望未来可能的发展路径。无论您是技术爱好者还是普通用户,这篇文章都将带您走进一个充满创新与可能性的移动世界。 ####
35 3
|
1月前
|
Ubuntu Linux Android开发
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
本文介绍了如何在Android设备上安装Termux和AnLinux,并通过这些工具运行Ubuntu系统和桌面环境。
123 2
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
|
1月前
|
Web App开发 Android开发
利用firefox调试安卓手机端web
该教程详细介绍如何通过Firefox浏览器实现手机与电脑的远程调试。手机端需安装最新版Firefox,并按指定步骤设置完成;电脑端则需安装15版及以上Firefox。设置完成后,通过工具栏中的“远程调试”选项,输入手机IP地址即可连接。连接确认后,即可使用电脑端Firefox调试器调试手机上的Web信息。注意,调试前手机需提前打开目标网页。
64 2
|
23天前
|
Android开发 iOS开发 UED
安卓与iOS的较量:谁才是智能手机市场的王者?
本文将深入探讨安卓和iOS两大智能手机操作系统之间的竞争关系,分析它们各自的优势和劣势。通过对比两者在市场份额、用户体验、应用生态等方面的表现,我们将揭示出谁才是真正的市场领导者。无论你是安卓粉丝还是iOS忠实用户,这篇文章都将为你提供一些有趣的观点和见解。
|
4月前
|
监控 Android开发 开发者
Android经典面试题之实战经验分享:如何简单实现App的前后台监听判断
本文介绍在Android中判断应用前后台状态的两种方法:`ActivityLifecycleCallbacks`和`ProcessLifecycleOwner`。前者提供精细控制,适用于需针对每个Activity处理的场景;后者简化前后台检测,适用于多数应用。两者各有优劣:`ActivityLifecycleCallbacks`更精确但复杂度高;`ProcessLifecycleOwner`更简便但可能在极端场景下略有差异。根据应用需求选择合适方法。
39 2
|
3月前
|
Android开发
【Azure 环境】记录使用Notification Hub,安卓手机收不到Push通知时的错误,Error_Code 30602 or 30608
【Azure 环境】记录使用Notification Hub,安卓手机收不到Push通知时的错误,Error_Code 30602 or 30608
|
4月前
|
存储 移动开发 Android开发
使用kotlin Jetpack Compose框架开发安卓app, webview中h5如何访问手机存储上传文件
在Kotlin和Jetpack Compose中,集成WebView以支持HTML5页面访问手机存储及上传音频文件涉及关键步骤:1) 添加`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限,考虑Android 11的分区存储;2) 配置WebView允许JavaScript和文件访问,启用`javaScriptEnabled`、`allowFileAccess`等设置;3) HTML5页面使用`<input type="file">`让用户选择文件,利用File API;
|
3月前
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。
|
4月前
|
API Android开发
Android 监听Notification 被清除实例代码
Android 监听Notification 被清除实例代码
|
5月前
|
Android开发
技术经验分享:Android前后台切换的监听
技术经验分享:Android前后台切换的监听
89 2