让按钮在输入法之上显示,实现一个优雅的登陆界面
2016-10-13 18:30
260 查看
在做登录界面时,“登录”按钮总是会被输入法挡住,要点击登录需要先收起输入法才能点击,这么多余的操作身为一个有强迫症的程序猿怎么能忍。
在做这个之前,首先想到的肯定是设置android:windowSoftInputMode属性,然而并不能达想要的效果,果断放弃。解决办法是给rootView设置一个OnGlobalLayoutListener的监听事件,当布局发生改变时改变控件位置的方式来实现。实现代码如下:
/**
* @param root 最外层布局,需要调整的布局
* @param scrollToView 被键盘遮挡的scrollToView,滚动root,使scrollToView在root可视区域的底部
*/
private void controlKeyboardLayout(final View root, final View scrollToView) {
// 注册一个回调函数,当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时调用这个回调函数。
root.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
// 获取root在窗体的可视区域
root.getWindowVisibleDisplayFrame(rect);
// 当前视图最外层的高度减去现在所看到的视图的最底部的y坐标
int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;
// 若rootInvisibleHeight高度大于100,则说明当前视图上移了,说明软键盘弹出了
if (rootInvisibleHeight > 100) {
//软键盘弹出来的时候
int[] location = new int[2];
// 获取scrollToView在窗体的坐标
scrollToView.getLocationInWindow(location);
// 计算root滚动高度,使scrollToView在可见区域的底部,同时设置scrollToView在键盘上20dp显示
int srollHeight = (location[1] + scrollToView.getHeight() + PixelUtil.dp2px(20, getContext())) - rect.bottom;
// 修复键盘会挡住布局的问题
if (srollHeight != 0){
root.scrollTo(0, srollHeight);
}
} else {
// 软键盘没有弹出来的时候
root.scrollTo(0, 0);
}
}
});
}
效果图:
参考文章:http://blog.csdn.net/harryweasley/article/details/50266749
在做这个之前,首先想到的肯定是设置android:windowSoftInputMode属性,然而并不能达想要的效果,果断放弃。解决办法是给rootView设置一个OnGlobalLayoutListener的监听事件,当布局发生改变时改变控件位置的方式来实现。实现代码如下:
/**
* @param root 最外层布局,需要调整的布局
* @param scrollToView 被键盘遮挡的scrollToView,滚动root,使scrollToView在root可视区域的底部
*/
private void controlKeyboardLayout(final View root, final View scrollToView) {
// 注册一个回调函数,当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时调用这个回调函数。
root.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
// 获取root在窗体的可视区域
root.getWindowVisibleDisplayFrame(rect);
// 当前视图最外层的高度减去现在所看到的视图的最底部的y坐标
int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;
// 若rootInvisibleHeight高度大于100,则说明当前视图上移了,说明软键盘弹出了
if (rootInvisibleHeight > 100) {
//软键盘弹出来的时候
int[] location = new int[2];
// 获取scrollToView在窗体的坐标
scrollToView.getLocationInWindow(location);
// 计算root滚动高度,使scrollToView在可见区域的底部,同时设置scrollToView在键盘上20dp显示
int srollHeight = (location[1] + scrollToView.getHeight() + PixelUtil.dp2px(20, getContext())) - rect.bottom;
// 修复键盘会挡住布局的问题
if (srollHeight != 0){
root.scrollTo(0, srollHeight);
}
} else {
// 软键盘没有弹出来的时候
root.scrollTo(0, 0);
}
}
});
}
效果图:
参考文章:http://blog.csdn.net/harryweasley/article/details/50266749
相关文章推荐
- swing初始化一个JFrame实现点击A界面的一个按钮,显示B界面,无论点击多少次,都只显示一个B界面
- 编写一个jsp程序,实现用户登录,当用户输入的用户或密码错误时,将页面重定向到错误提示页,并在该页面显示30秒后 自动回到用户登录界面
- 用户在文本框中输入需要转换的十进制数,通过点击3个按钮在标签中显示结果。(点击一个实现一个)
- 制作login.jsp页面,要求实现提供用户登陆的界面, 用户通过该界面输入用户名(控件名userName)和密码(控件名password), 然后点击“登录”按钮实现登陆操作.
- 1.编程实现“油耗计算机程序”。要求:输入加油金额、公里数、汽油价格,单击“计算”按钮,显示百公里油耗。界面如图:
- 1, 编写程序,当用户在文本框中输入内容之后,单机不同的按钮,能够把文半框中的内容粘贴到文本区中。“重置”按钮实现将文本框和文本区中的内容清空。界面上的文本区只能显示内容,不能让用户输入文本。运行结果
- 用WPF写一个登录界面,我想在输入完密码后按回车就能够验证登陆,而不需要用鼠标单击登陆按钮
- 如何用数据驱动实现通用化巡检APP(如何一个界面里添加多个点击拍照按钮并显示在不同的imageview里)
- 设计一个JFrame窗口,输入学生的基本信息,包括学号、姓名、学院、专业(下拉列表)、班级、籍贯(级联)、性别(单选按钮)、爱好(多选)、备注等,在界面中包括提交和重填按钮。提交后弹出窗口显示学生信息
- .做一个登陆的界面,当用户输入正确的用户名和密码后,显示登陆成功,并且显示改用户的详细信息。(sqldatasource)
- 利用5个标签,4个文本框,2个按钮,自己设计布局实现输入三边求三角形面积。界面如下所示。三角形类的编写可以使用实验4中已经写过的三角形类,当点击“判断三边”时,若能构成三角形,在标签5上显示“可以构成三角形!”,如不能构成三角形,在标签5上显示“不能构成三
- 窗体上有两个文本框:一个文本框中最多输入字符6个;一个文本框中输入任何内容都显示*号。再添加一个按钮、2个单选按钮。实现单击按钮后,根据单选按钮,将对应文本框中内容显示在标签
- 实现一个计算器,界面包括10个数字按钮(0至9)和四个运算符(加减乘除)按钮,以及等号和清空两个辅助按钮,还有一个用于显示输入输出的文本框。
- JS 实现获取打开一个界面中输入的值
- 用C++实现从控制台输入一个方阵并存储显示
- 实现启动一个activity但不显示其界面
- Android实现一个记住密码的登陆界面
- 通过js选择按钮实现一个内容隐藏另一个内容显示
- 实现一个记住密码的Android登陆界面
- ios开发:怎么实现点击一个按钮,跳转到一个新的界面