一、软键盘显示的原理

软件盘的本质是什么?软键盘其实是一个Dialog!
InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或者全屏显示。
二、活动主窗口调整
android定义了一个属性,名字为windowSoftInputMode, 用它可以让程序可以控制活动主窗口调整的方式。我们可以在AndroidManifet.xml中对Activity进行设置。如:android:windowSoftInputMode="stateUnchanged|adjustPan"
该属性可选的值有两部分,一部分为软键盘的状态控制,另一部分是活动主窗口的调整。前一部分本文不做讨论,请读者自行查阅android文档。
模式一,压缩模式
windowSoftInputMode的值如果设置为adjustResize,那么该Activity主窗口总是被调整大小以便留出软键盘的空间。
我们通过一段代码来测试一下,当我们设置了该属性后,弹出输入法时,系统做了什么。
重写Layout布局:
public class ResizeLayout extends LinearLayout{
private static int count = 0;
public ResizeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
Log.e("onSizeChanged " + count++, "=>onResize called! w="+w + ",h="+h+",oldw="+oldw+",oldh="+oldh);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
Log.e("onLayout " + count++, "=>OnLayout called! l=" + l + ", t=" + t + ",r=" + r + ",b="+b);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.e("onMeasure " + count++, "=>onMeasure called! widthMeasureSpec=" + widthMeasureSpec + ", heightMeasureSpec=" + heightMeasureSpec);
}
xml:
<com.winuxxan.inputMethodTest.ResizeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" /> <LinearLayout android:id="@+id/bottom_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:gravity="bottom">s <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:background="#77777777" /> </LinearLayout> </com.winuxxan.inputMethodTest.ResizeLayout>
AndroidManifest.xml的Activity设置属性:android:windowSoftInputMode = "adjustResize"
运行程序,点击文本框,查看调试信息:
E/onMeasure 6(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742025 E/onMeasure 7(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742025 E/onSizeChanged 8(7960): =>onSizeChanged called! w=320,h=201,oldw=320,oldh=377 E/onLayout 9(7960): =>OnLayout called! l=0, t=0,r=320,b=201
从调试结果我们可以看出,当我们点击文本框后,根布局调用了onMeasure,onSizeChanged和onLayout。
实际上,当设置为adjustResize后,软键盘弹出时,要对主窗口布局重新进行measure和layout,而在layout时,发现窗口的大小发生的变化,因此调用了onSizeChanged。
从下图的运行结果我们也可以看出,原本在下方的TextView被顶到了输入法的上方。
模式二,平移模式
windowSoftInputMode的值如果设置为adjustPan,那么该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。
上面的例子中,我们将AndroidManifest.xml的属性进行更改:android: windowSoftInputMode = "adjustPan"
重新运行,并点击文本框,查看调试信息:
E/onMeasure 6(8378): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec=1073742200 E/onMeasure 7(8378): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec=1073742201 E/onLayout 8(8378): =>OnLayout called! l=0, t=0,r=320,b=377
我们看到:系统也重新进行了measrue和layout,但是我们发现,layout过程中onSizeChanged并没有调用,这说明输入法弹出前后并没有改变原有布局的大小。
从下图的运行结果我们可以看到,下方的TextView并没有被顶到输入法上方。
事实上,当输入框不会被遮挡时,该模式没有对布局进行调整,然而当输入框将要被遮挡时,窗口就会进行平移。也就是说,该模式始终是保持输入框为可见。如下图,整个窗口,包括标题栏均被上移,以保证文本框可见
模式三 自动模式
当属性windowSoftInputMode被设置为adjustUspecified时,它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为设置。
也就是说,系统自动决定是采用平移模式还是压缩模式,决定因素在于内容是否可以滚动。
以上所述是小编给大家介绍的Android软键盘的显示隐藏功能实现过程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# android隐藏软键盘
# android
# 软键盘
# Android Dialog中软键盘的显示与隐藏的示例
# Android 显示和隐藏软键盘的方法(手动)
# Android编程之软键盘的隐藏显示实例详解
# 解析android中隐藏与显示软键盘及不自动弹出键盘的实现方法
# Android开发中软键盘的显示和隐藏
# 设置为
# 文本框
# 输入框
# 弹出
# 当我们
# 可以看出
# 不被
# 全屏
# 将该
# 小编
# 进行了
# 是一个
# 有任何
# 也就是说
# 他们的
# 就会
# 在此
# 而在
# 我们可以
# 给大家
相关文章:
宝塔建站助手安装配置与建站模板使用全流程解析
建站之星如何修改网站生成路径?
建站之星备案是否影响网站上线时间?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
如何用PHP快速搭建CMS系统?
建站上市公司网站建设方案与SEO优化服务定制指南
如何在Windows虚拟主机上快速搭建网站?
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
如何在建站之星绑定自定义域名?
Android自定义控件实现温度旋转按钮效果
网站制作需要会哪些技术,建立一个网站要花费多少?
如何通过VPS建站无需域名直接访问?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
潮流网站制作头像软件下载,适合母子的网名有哪些?
定制建站价位费用解析与套餐推荐全攻略
h5在线制作网站电脑版下载,h5网页制作软件?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
制作旅游网站html,怎样注册旅游网站?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何将凡科建站内容保存为本地文件?
,南京靠谱的征婚网站?
如何高效完成独享虚拟主机建站?
如何通过主机屋免费建站教程十分钟搭建网站?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
建站之星在线客服如何快速接入解答?
如何选择网络建站服务器?高效建站必看指南
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
教程网站设计制作软件,怎么创建自己的一个网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
在线教育网站制作平台,山西立德教育官网?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
广东企业建站网站优化与SEO营销核心策略指南
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
建站VPS配置与SEO优化指南:关键词排名提升策略
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
招商网站制作流程,网站招商广告语?
如何在自有机房高效搭建专业网站?
官网网站制作腾讯审核要多久,联想路由器newifi官网
建站之星如何保障用户数据免受黑客入侵?
建站之星后台管理:高效配置与模板优化提升用户体验
,如何利用word制作宣传手册?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
定制建站是什么?如何实现个性化需求?
*请认真填写需求信息,我们会在24小时内与您取得联系。