android 软件盘弹回去的最好体验,Android 软键盘弹出 日常填坑

开发输入框的开发者都会遇到一个问题,那就是在登录界面时,当你点击输入框时,下边的按钮有时会被输入框挡住,这个不利于用户的体验,所以很多人希望软键盘弹出时,也能把按钮挤上去。这样的交互更人性化,做得合理。

我们可以在AndroidManifest.xml的Activity设置属性:android:windowSoftInputMode = "adjustResize" ,软键盘弹出时,要对主窗口布局重新进行布局,并调用onSizeChanged方法,切记一点当我们设置为“adjustResize”时,我们的界面不要设置为全屏模式,否则设置了这个属性也不会有什么效果。而当我们设置android: windowSoftInputMode = "adjustPan"时,主窗口就不会调用onSizeChanged方法,界面的一部分就会被软键盘覆盖住,就不会被挤到软键盘之上了。

我们通过一段代码来测试一下,当我们设置了该属性后,弹出输入法时,系统做了什么:

1、重写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);

}

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);

}

2、我们的布局设置为:

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"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

android:id="@+id/bottom_layout"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

android:gravity="bottom">s

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

android:background="#77777777"

/>

3、打印信息比对

AndroidManifest.xml的Activity设置属性:android:windowSoftInputMode = "adjustResize"

运行程序,点击文本框,查看调试信息:

E/onMeasure 6(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742024

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。

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并没有调用,这说明输入法弹出前后并没有改变原有布局的大小。

当然还有其他属性可以设置:

"stateUnspecified"

软键盘的状态(是否它是隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。

这个是为了软件盘行为默认的设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java JVM、JNI、Native Function Interface、Create New Process Native Function API Analysis

目录 1. JAVA JVM 2. Java JNI: Java Native Interface 3. Java Create New Process Native Function API Analysis In Linux 4. Java Create New Process Native Function API Analysis In Windows 1. JAVA JVM 0x1: JVM架构简介 JVM是Java Virtual Machine(Java虚拟机)的缩写…

php 输入汉字自动带出拼音和英文

需求就是添加一个字段的时候,自动带出中文和英文,方便数据索引。这里只贴下代码,英文用在线api,中文用类库。我觉得这个拼音类库比较好,不会出现重庆是zhongqing之类的问题,因为可以自定义添加维护。 要说明…

小android模拟器,小姚Android模拟器工作室版本v6.2.7.0正式版

逍遥Android Emulator Studio Edition是高质量的Android模拟器. 此版本是特殊版本,支持无限的多打开,智能管理和组控制模式. 它是专门为需要商业营销的用户设计的. Xiaoyao Android Emulator Studio Edition具有强大的引擎和良好的兼容性全能营销王 安卓…

判断 iframe 是否加载完成的完美方法(转)

般来说,我们判断 iframe 是否加载完成其实与 判断 JavaScript 文件是否加载完成 采用的方法很类似: var iframe document.createElement("iframe"); iframe.src "http://www.planabc.net"; if (!/*cc_on!*/0) { //if not IE if…

【原创】注意析构函数的使用

清单:虚析构函数使用 1 class X { 2 public: 3 virtual ~X() default; // 编译器自动生成 defaulted 函数定义体4 private: 5 int x; 6 }; 7 class Y: public X { 8 private: 9 int y; 10 }; 11 int main(){ 12 X* x new Y; 13 delete x; 清单…

html5调用手机摄像头和相册,h5 调用手机摄像头/相册

html 部分js 部分getBase64: function (file, callback) {var maxWidth 640if (file.files && file.files[0]) {var thisFile file.files[0]// if (thisFile.size > 524288) {// this.showToast("图片不能超过512k!");// return;// }var…

hadoop中实现定制Writable类

Hadoop中有一套Writable实现可以满足大部分需求,但是在有些情况下,我们需要根据自己的需要构造一个新的实现,有了定制的Writable,我们就可以完全控制二进制表示和排序顺序。 为了演示如何新建一个定制的writable类型,我…

html5carousel图片轮播,jQuery响应式轮播图插件VM Carousel

插件描述:VM Carousel是一款jQuery响应式轮播图插件。该jquery轮播图插件支持自动播放模式,支持动态改变图片尺寸,支持居中模式,以及无限循环等。使用方法在页面中引入jquery.vm-carousel.css,jquery和jquery.vm-carou…

tableview或scrollview Y轴发生变化解决方案

在viewDidLoad中加入 self.automaticallyAdjustsScrollViewInsets NO; 转载于:https://www.cnblogs.com/mo-shou/p/4335163.html

NOIP 货车运输

题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物…

那是计算机房吗英语否定回答,【微课+教材+听力+知识点】PEP四年级英语下册 Unit 1...

原标题:【微课教材听力知识点】PEP四年级英语下册 Unit 1微课:Unit 1-PartA微课:Unit 1-PartB微课:Unit 1-PartC课文教材动画教材听力Unit 1 My schoolUnit 1 单词▲点右上方绿标即可收听Words in Unit 1first floor [ˌfɜːst ˈ…

django html显示xml,如何将HTML与Django集成?

Django可能会为此而大肆渲染。如果您想要的只是一种将表单链接到某些后端Python代码的方法,那么像Flask这样的微框架可能是更好的选择。下面是你如何用烧瓶做一个简单的表格:创建一个目录project,其中有一个目录templates你的模板很简单&…

PropertyGrid控件 分类(Category)及属性(Property)排序

最近在做表单设计器,设计器上的控件都是我们自己封装的,但每个属性类别里的属性是按照属性的拼音排序的,现在想按照PropertyIndex标识进行排序(PropertyIndex的后三位是用来标识编辑器的)。 具体实现如下: …

css3标签

-moz代表firefox浏览器私有属性 -ms代表ie浏览器私有属性 -webkit代表chrome、safari私有属性 -o代表opera私有属性 border-radius:2em; 向div元素添加圆角边框,这是一种缩小写法,等价于: border-top-left-radius:2em; border-top-right-radius:2em; bor…

用计算机计算出密码,自带计算器的密码

手机、电脑都会有自带的计算器,用惯了简易的计算器功能,不知道有没有感觉 iPhone 自带的计算器难用?后来才发现原来它还可以使用科学计算器进行指数函数、对数函数和三角函数的计算。只需要将 iPhone 转到横排模式就可以:这算不算…

PHP内核探索之变量(6)- 后续内核探索系列大纲备忘

年前因为工作比较饱和,现在又忙着换工作的事情,基本停止了对博文的更新。后续的博文,还是慢慢补上吧。 为了不至于过于发散,先搞个未成形的大纲,如下: PHP内核探索之变量 不平凡的字符串  PHP内核探索之…

ios 开发日记 21 -自动处理键盘事件的第三方库:IQKeyboardManager

我们写界面要考虑很多用户体验问题,键盘事件的响应就是比较麻烦的一种。我们需要监听键盘事件,考虑点击背景收起键盘、考虑键盘遮挡输入框问题等等,而且每个界面都要做这么一套。这个库帮我们解决了这个事情。 这个库的下载地址:h…

shopify在哪里填写html,[Shopify开店教程]添加嵌入代码

添加嵌入代码在Shopify管理员中创建购买按钮后,您就可以将其添加到您自己的网站或博客中。将嵌入代码添加到您网站的源HTML的过程有所不同,具体取决于您希望购买按钮和购物车在您的发布平台上显示的方式和位置,以及有时您在该平台上使用的主题…

activity生命周期图

转载于:https://www.cnblogs.com/aqianglala/p/4344431.html

华硕台式计算机光盘怎么启动不了,华硕笔记本怎么用光盘重装系统 笔记本重装系统失败怎么办...

华硕笔记本是现在非常热门的笔记本品牌,很多的华硕笔记本用户在重装系统的时候,大多数会用上光盘,这种重装方式较为简单,所以备受青眯,不过呢还是有很多电脑用户不知道怎么用光盘重装系统,没关系&#xff0…