安卓日常开发记录-键盘的相关处理方式
点击EditText之外隐藏键盘的实现方式
重写事件分发dispatchTouchEvent,注意不要在onTouchEvent中操作,因为onTouchEvent并非任何情况下都会被调用。通过计算EditText在布局中的位置,进行键盘的显示和隐藏处理
/** * 点击区域在输入框之外都隐藏掉键盘 * @param ev * @return */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (isShouldHideInput(v, ev)) { hideSoftKeyboard(v); } return super.dispatchTouchEvent(ev); } // 必不可少,否则所有的组件都不会有TouchEvent了 if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); } public boolean isShouldHideInput(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { int[] leftTop = { 0, 0 }; //获取输入框当前的location位置 v.getLocationInWindow(leftTop); int left = leftTop[0]; int top = leftTop[1]; int bottom = top + v.getHeight(); int right = left + v.getWidth(); if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { // 点击的是输入框区域,保留点击EditText的事件 return false; } else { return true; } } return false; }
监听键盘弹起和隐藏的方式
自定义一个view,因为项目中用的LinearLayout,所以以这个布局为例,将其作为根布局,通过布局的高度判断键盘的隐藏和显示,通过接口将结果回调出去
需要在AndroidManifest中配置键盘属性
android:windowSoftInputMode="adjustUnspecified|stateHidden"
android:windowSoftInputMode="adjustResize|stateHidden"
经过测试上边两种配置都可以实现,但是下边这种不行,具体原因,你可以去看看 adjustUnspecified adjustResize adjustPan的区别
android:windowSoftInputMode="adjustPan|stateHidden"
package com.anjuke.library.uicomponent.view; import android.content.Context; import android.util.AttributeSet; import android.widget.LinearLayout; /** * Author: renzhenming * Time: 2018/8/11 16:58 * Email: renzhenming@58ganji.com * Version:12.3 * Description: 用于监听键盘的隐藏和出现 */ public class AjkAdjustSizeLinearLayout extends LinearLayout { public AjkAdjustSizeLinearLayout(Context context) { super(context); } public AjkAdjustSizeLinearLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public AjkAdjustSizeLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); } private int mChangeSize = 200; /** * 键盘弹起时,布局的高度因为受到挤压,会变小,所以新的高度h减去旧的高度oldh会得到一个负数 * 这个负数的绝对值等于键盘的高度,而且基本可以确定的是键盘的高度一定是大于200的,所以满足 * (oldw != 0 && h - oldh < -mChangeSize)就可以当做键盘弹起 * * 键盘收起时,布局高度恢复到最初,新的高度h减去oldh得到一个正数,这个数值正好就是键盘的高度 * 所以满足(oldw != 0 && h - oldh > mChangeSize)时,可以看做是键盘收起 * @param w * @param h * @param oldw * @param oldh */ @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (oldw == 0 || oldh == 0) return; if (boardListener != null) { if (oldw != 0 && h - oldh < -mChangeSize) { boardListener.keyBoardVisible(Math.abs(h - oldh)); } if (oldw != 0 && h - oldh > mChangeSize) { boardListener.keyBoardInvisible(Math.abs(h - oldh)); } } } public interface SoftKeyBoardListener { void keyBoardVisible(int move); void keyBoardInvisible(int move); } SoftKeyBoardListener boardListener; public void setSoftKeyBoardListener(SoftKeyBoardListener boardListener) { this.boardListener = boardListener; } }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 进阶自定义View(4)图表统计LineChartView曲线图的实现
接着上篇,今天介绍一下曲线图 / 折线图的实现方法,先上效果图: image.png 曲线图很简单了,坐标轴跟刻度线跟上篇柱状图的绘制一样一样滴,绘制曲线图,关键就是确定好Y轴的每个点,然后用绘制曲线的方法,把点连起来就OK了。 (1)确定数据在坐标轴上对应的每个点 /** * 根据传入的数据,确定绘制的点 * * @return */ private Point[] initPoint() { Point[] points = new Point[mDatas.size()]; for (int i = 0; i < mDatas.size(); i++) { Integer ybean = mDatas.get(i); int drawHeight = (int) (startY * 1.0 - (ybean * yAxisSpace * 1.0 / yIncreaseValue)); int startx = startX + xAxisSpace * i; points[i] = new Point(startx, drawHeight); } Log.e("TAG", ...
- 下一篇
Android LayoutInflater的用法详解
相信我们在开发过程中肯定接触过LayoutInflater,比如ListView的适配器里的getView方法里通过LayoutInflater.from(Context).inflater来加载xml布局,在Fragment里的onCreateView里面也是一样,加载布局一共三种方法。 1,在Activity里面调用getLayoutInflater() 2, 通过LayoutInflater.from(context).inflater() 3, context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)) 以上的三种方式从实现上都是一样的,Activity里面的getLayoutInflater()实际上调用的是PhoneWindow的实现,而PhoneWindow里源码的处理是LayoutInflater.from(context).inflater(),往下查找最终调用context.getSystemService。 context.getSystemService是Android里一个比较重要的api,是Activ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS关闭SELinux安全模块
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范