Android软键盘(六)如何监听到软件盘显示与隐藏的事件,完美实现登录界面
2017-10-23 10:05
1376 查看
结合文章
1.http://blog.csdn.net/hknock/article/details/18667181
2.Android 显示和隐藏软键盘
activity 添加
android:windowSoftInputMode="stateHidden|stateUnchanged"
有时候我们需要监听软件盘隐藏事件。但是官方并没有提供相关的监听回调,这时我们就需要通过计算布局来判断软键盘的关闭事件了。思路与上一篇文章Android软键盘(五)如何判断软键盘是否显示相似。
看效果图:
有图有证据,不说了,上代码:
[java] view
plain copy
@Override
protected void onResume() {
super.onResume();
//获取当前屏幕内容的高度
screenHeight = getWindow().getDecorView().getHeight();
getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//获取View可见区域的bottom
Rect rect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
if(bottom!=0 && oldBottom!=0 && bottom - rect.bottom <= 0){
Toast.makeText(Main3Activity.this, "隐藏", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(Main3Activity.this, "弹出", Toast.LENGTH_SHORT).show();
}
}
});
}
可以看出,关键代码都用了上一篇文章写到的。获取屏幕内容高度,并获取当前内容的可见区域的bottom值,再进行计算,那么addOnLayoutChangeListener是什么呢?是一个监听布局重绘的回调,每当这个view被重绘了,onLayout就被回调了。所以每次键盘的弹出和隐藏必然伴随着布局的重绘,所以这个监听必然会被回调,所以在内部再判断一下监听是否在显示即可。我在上述代码中用了bottom
- rect.bottom 这样的判断,bottom值代表重绘完成之后这个view的bottom值。
上面从图中看出有一个小bug,就是第一次进入界面的时候,也会判断键盘的状态.....这个大家自己想办法屏蔽一下吧,我就懒得弄了。
-------------------------------------------------------------------------------------------------------------------
这里来说一下网上比较流行的大神的做法:
[java] view
plain copy
public class MainActivity extends Activity implements OnLayoutChangeListener{
//Activity最外层的Layout视图
private View activityRootView;
//屏幕高度
private int screenHeight = 0;
//软件盘弹起后所占高度阀值
private int keyHeight = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activityRootView = findViewById(R.id.root_layout);
//获取屏幕高度
screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
//阀值设置为屏幕高度的1/3
keyHeight = screenHeight/3;
}
@Override
protected void onResume() {
super.onResume();
//添加layout大小发生改变监听器
activityRootView.addOnLayoutChangeListener(this);
}
@Override
public void onLayoutChange(View v, int left, int top, int right,
int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值
// System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);
// System.out.println(left + " " + top +" " + right + " " + bottom);
//现在认为只要控件将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();
}
}
上述原文链接http://blog.csdn.net/bear_huangzhen/article/details/45896333
他是用oldBottom - bottom来判断的,但是经过我的测试,这种做法 只有在界面内有ListView或者ScrollView的情况下才管用,如果界面内没有这种控件,那么键盘的弹出与隐藏,onLayout方法中回调的 oldBottom 和bottom值一直是相等的,无论布局是否上移。所以这是个坑,我看到原文链接一大堆人抱怨不管用,又有一些人说管用,所以我在这里阐述一下,我的那种方法,在哪种情况下都管用。 我在第二篇和第四篇中探讨布局上移的问题就讨论过了,界面存在ListView这种控件和不存在这种类似控件的情况是不一样的,所以出现这种情况很正常。据我测试,如果界面不存在ListView这种控件,弹出和隐藏键盘之后,虽然整个布局上移,下移,但是onLayout方法中bottom和oldBottom一直相等,并且一直和未弹出键盘时一样,所以,呵呵╮(╯▽╰)╭
1.http://blog.csdn.net/hknock/article/details/18667181
2.Android 显示和隐藏软键盘
activity 添加
android:windowSoftInputMode="stateHidden|stateUnchanged"
有时候我们需要监听软件盘隐藏事件。但是官方并没有提供相关的监听回调,这时我们就需要通过计算布局来判断软键盘的关闭事件了。思路与上一篇文章Android软键盘(五)如何判断软键盘是否显示相似。
看效果图:
有图有证据,不说了,上代码:
[java] view
plain copy
@Override
protected void onResume() {
super.onResume();
//获取当前屏幕内容的高度
screenHeight = getWindow().getDecorView().getHeight();
getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//获取View可见区域的bottom
Rect rect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
if(bottom!=0 && oldBottom!=0 && bottom - rect.bottom <= 0){
Toast.makeText(Main3Activity.this, "隐藏", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(Main3Activity.this, "弹出", Toast.LENGTH_SHORT).show();
}
}
});
}
可以看出,关键代码都用了上一篇文章写到的。获取屏幕内容高度,并获取当前内容的可见区域的bottom值,再进行计算,那么addOnLayoutChangeListener是什么呢?是一个监听布局重绘的回调,每当这个view被重绘了,onLayout就被回调了。所以每次键盘的弹出和隐藏必然伴随着布局的重绘,所以这个监听必然会被回调,所以在内部再判断一下监听是否在显示即可。我在上述代码中用了bottom
- rect.bottom 这样的判断,bottom值代表重绘完成之后这个view的bottom值。
上面从图中看出有一个小bug,就是第一次进入界面的时候,也会判断键盘的状态.....这个大家自己想办法屏蔽一下吧,我就懒得弄了。
-------------------------------------------------------------------------------------------------------------------
这里来说一下网上比较流行的大神的做法:
[java] view
plain copy
public class MainActivity extends Activity implements OnLayoutChangeListener{
//Activity最外层的Layout视图
private View activityRootView;
//屏幕高度
private int screenHeight = 0;
//软件盘弹起后所占高度阀值
private int keyHeight = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activityRootView = findViewById(R.id.root_layout);
//获取屏幕高度
screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
//阀值设置为屏幕高度的1/3
keyHeight = screenHeight/3;
}
@Override
protected void onResume() {
super.onResume();
//添加layout大小发生改变监听器
activityRootView.addOnLayoutChangeListener(this);
}
@Override
public void onLayoutChange(View v, int left, int top, int right,
int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值
// System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);
// System.out.println(left + " " + top +" " + right + " " + bottom);
//现在认为只要控件将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();
}
}
上述原文链接http://blog.csdn.net/bear_huangzhen/article/details/45896333
他是用oldBottom - bottom来判断的,但是经过我的测试,这种做法 只有在界面内有ListView或者ScrollView的情况下才管用,如果界面内没有这种控件,那么键盘的弹出与隐藏,onLayout方法中回调的 oldBottom 和bottom值一直是相等的,无论布局是否上移。所以这是个坑,我看到原文链接一大堆人抱怨不管用,又有一些人说管用,所以我在这里阐述一下,我的那种方法,在哪种情况下都管用。 我在第二篇和第四篇中探讨布局上移的问题就讨论过了,界面存在ListView这种控件和不存在这种类似控件的情况是不一样的,所以出现这种情况很正常。据我测试,如果界面不存在ListView这种控件,弹出和隐藏键盘之后,虽然整个布局上移,下移,但是onLayout方法中bottom和oldBottom一直相等,并且一直和未弹出键盘时一样,所以,呵呵╮(╯▽╰)╭
相关文章推荐
- Android软键盘(六)如何监听到软件盘显示与隐藏的事件
- android基础之如何实现触屏监听和鼠标点击事件
- android:监听软件盘“返回”键显示隐藏事件
- Android基于mAppWidget实现手绘地图(十三)–如何显示/隐藏任意类型的地图对象
- Android 中隐藏输入法 显示软键盘 及键盘回车键响应登录或发送
- 登录界面与Android软键盘显示、隐藏的交互设计
- Android自定义软键盘输入法,隐藏系统输入法显示光标的实现
- android中隐藏与显示软键盘及不自动弹出键盘及软键盘将布局顶上去的实现方法
- Android 类似淘宝 电商 搜索功能,监听软键盘搜索事件,延迟自动搜索,以及时间排序的搜索历史记录的实现
- Android 监听scrollview滚动实现ToolBar显示和隐藏的效果
- Android如何监听系统输入法弹出显示事件
- Android如何实现友好的界面显示效果
- 解析android中隐藏与显示软键盘及不自动弹出键盘的实现方法
- Android 如何让EditText不自动获取焦点 在项目中,一进入一个页面, EditText默认就会自动获取焦点。 那么如何取消这个默认行为呢? 在网上找了好久,有点 监听软键盘事件
- Windows XP中如何实现在登录界面上不显示过多用户名
- 解析android中隐藏与显示软键盘及不自动弹出键盘的实现方法
- Android windowSoftInputMode软键盘显示和隐藏的监听和实现
- 解析android中隐藏与显示软键盘及不自动弹出键盘的实现方法
- 解析android中隐藏与显示软键盘及不自动弹出键盘的实现方法
- 如何响应软键盘显示隐藏事件