安卓之软键盘监听与切换软键盘状态和重新获取EditText焦点
最近在工作中的时候遇到了关于使用ScrollView作为外层点击内部EditText弹出软键盘滑动页面的问题,百度了好久各种教程,但是对于我的页面来说没有一个有用的,自己花了1天时间终于搞定了,今天在这里分享一下我的解决方案。(这篇文章是我当时写在博客园上,此次将其搬家,已经过去一年了代码中可能存在问题,下期修改出完整版,欢迎大家评论)
下面先贴出布局代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.croshe.loans.activity.AddContactsActivity"><ScrollViewandroid:id="@+id/scrollContent"android:layout_width="match_parent"android:layout_height="match_parent"android:fadeScrollbars="true"android:fillViewport="true"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/backGround"android:fitsSystemWindows="true"><LinearLayoutandroid:id="@+id/llItem"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"android:visibility="visible"><TextViewandroid:id="@+id/lld_add_two_contacts"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/handAdd"android:textSize="20sp" /><LinearLayoutandroid:id="@+id/ll_add_contacts_add"android:layout_width="200dp"android:layout_height="50dp"android:layout_marginTop="20dp"android:background="@drawable/hand_add_contacts"android:gravity="center"android:layout_marginBottom="20dp"><ImageViewandroid:layout_width="25dp"android:layout_height="25dp"android:scaleType="centerCrop"android:src="@mipmap/icon_add_contacts" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:text="添加"android:textColor="@color/white"android:textSize="18sp" /></LinearLayout><com.croshe.android.base.views.list.CrosheRecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="wrap_content"></com.croshe.android.base.views.list.CrosheRecyclerView><includeandroid:id="@+id/llAdds"layout="@layout/hand_add_contacts"android:visibility="gone" /><Buttonandroid:id="@+id/btn_confirmAuth"android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="10dp"android:visibility="gone"android:background="@drawable/login_button"android:hint="提交认证"android:textColorHint="@color/white"android:textSize="18sp" /></LinearLayout></LinearLayout></ScrollView>
</LinearLayout>
接下来在你的AndroidManifast.xml中设置给此Activity添加android:windowSoftInputMode=“adjustResize”(网上有的教程说这样做就可以滑动了,但是我的还是不能滑动,这个属性的意思是给软键盘留出位置,但是可能是我用了框架的原因,所以我的页面并不会滑动)
由于我的页面还不能滑动所以接下来将是最终版解决方案:
百度了一下软键盘监听类,非常好用
package com.croshe.loans.util;
import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.Toast;
/*** 软键盘监听类* Created by *** on 2018/5/5 14:04.*/public class SoftKeyBoardListener {private View rootView;//activity的根视图int rootViewVisibleHeight;//纪录根视图的显示高度private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;public SoftKeyBoardListener(Activity activity) {//获取activity的根视图rootView = activity.getWindow().getDecorView();//监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {//获取当前根视图在屏幕上显示的大小Rect r = new Rect();rootView.getWindowVisibleDisplayFrame(r);int visibleHeight = r.height();if (rootViewVisibleHeight == 0) {rootViewVisibleHeight = visibleHeight;return;}//根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变if (rootViewVisibleHeight == visibleHeight) {return;}//根视图显示高度变小超过200,可以看作软键盘显示了if (rootViewVisibleHeight - visibleHeight > 200) {if (onSoftKeyBoardChangeListener != null) {onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);}rootViewVisibleHeight = visibleHeight;return;}//根视图显示高度变大超过200,可以看作软键盘隐藏了if (visibleHeight - rootViewVisibleHeight > 200) {if (onSoftKeyBoardChangeListener != null) {onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);}rootViewVisibleHeight = visibleHeight;return;}}});}private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;}public interface OnSoftKeyBoardChangeListener {void keyBoardShow(int height);void keyBoardHide(int height);}public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);}}
在你的Activity的onCreate方法中监听就可以了
监听方法如下
/*** 监听软键盘弹出隐藏*/
SoftKeyBoardListener.setListener(AddContactsActivity.this, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {//软键盘弹出时执行的方法@Overridepublic void keyBoardShow(int height) {//此方法为我需要隐藏页面中视图方法可忽略viewGone();//设置软键盘切换状态,防止出错mhideSoftInput = true;//滑动ScrollView至底部mScrollView.fullScroll(ScrollView.FOCUS_DOWN);//定义变量nunEditText判断用户点击了那个EditText,因为滑动ScrollView后会失去焦点,所以需要重新聚焦if(numEditText!=0){switch (numEditText){case 1://聚焦方法etName.requestFocus();break;case 2://聚焦方法etPhone.requestFocus();break;case 3://聚焦方法etRelationShip.requestFocus();break;}}}//软键盘隐藏时执行的方法@Overridepublic void keyBoardHide(int height) {viewVisble();//定义该变量为全局变量用于控制软键盘弹出隐藏的判断mhideSoftInput = false;}
});
//软键盘状态切换方法
/*** 切换软键盘状态*/
public void hideSoftInput(){if(mhideSoftInput) {mhideSoftInput = false;InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);if (imm.isActive()) {// 如果开启imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,InputMethodManager.HIDE_NOT_ALWAYS);// 关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的}}else{return;}
}
这里有几个地方需要注意:
1>如果不需要切换请去除mhideSoftInput这个成员变量相关的所有代码例如切换软键盘状态代码和软键盘弹出隐藏时设置mhideSoftInput=true等
2>需要切换软键盘的话则需要定义成员变量mhideSoftInput
如还有问题,欢迎大家评论告知,一起探讨更好的解决方案。
萌新第一次发博客,心情有点小激动-
安卓之软键盘监听与切换软键盘状态和重新获取EditText焦点相关推荐
- java键盘监听keyadapter_JAVA 键盘监听当中,释放键盘并没有停止运动
package plane; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; im ...
- android自定义键盘监听输入框,Android 自定义键盘的车牌输入框
版权声明:本文为博主原创文章,未经博主允许不得转载. 开发过与停车场有关的程序猿应该都涉及到车牌输入的开发,一些要求不高的就直接一个简单的输入框就搞定了,但是对于用户日益增加的体验度和产品经理永远满足 ...
- vant 软键盘_移动端软键盘监听(弹出,收起),及影响定位布局的问题
移动端软键盘监听(弹出,收起),及影响定位布局的问题 一:移动端软键盘监听(弹出,收起) 1.监听resize ( Android) var winHeight = $(window).height( ...
- android 软键盘监听、隐藏、显示、点击空白处隐藏和Android KEYCODE 键值大全
android 软键盘监听.隐藏.显示.点击空白处隐藏. textView.setOnKeyListener(new View.OnKeyListener() {@Overridepublic boo ...
- C#全局键盘监听(Hook)的使用(转载)
一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...
- C#全局键盘监听(Hook)
一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...
- Java日记_17.9.01——点击按钮后,键盘监听失效的原因与解决办法
最近在自学JAVA,听了前辈的安利在做自己的小画板,然后悲剧就发生了,同时添加按钮和键盘监听之后,就产生了如题的问题,一直觉得是自己监听事件注册的不对,改了一天,然后终于找到了原因,真的巨坑啊我觉得q ...
- Android 键盘监听 键盘展开/收起监听
如和优雅地实现键盘展开/收起监听 Android 键盘的展开与收起一直是个很遭人诟病的东西 方法各式各样都有,但是基本都不是很好用,有各种限制 这里编写了一个优雅地实现方式,利用屏幕实际高度与显示区域 ...
- java swing button和键盘监听冲突问题
原因: 点击button会让jframe失去焦点,然后键盘监听不起作用 解决: 让jframe重新获取焦点就行了 jf.setFocusable(true); // JFrame jf = new J ...
最新文章
- System.OutOfMemoryException
- 小型网络的组建及排错
- 系统封装接口层 cmsis_os
- byte[] 数组和字符串的转换,与byte[] 数组和int类型的之间的转化
- Cadence tensilica vision Q7 DSP
- EDA技术实用教程 | 复习十三 | 计数器
- C++ 什么是句柄?为什么会有句柄?HANDLE
- 命令行基础-tar命令详解
- flog和flag,FLAG标签和3xFLAG标签的序列
- 利好:北京医改鼓励医生个体行医异地行医
- 海恩法则和费曼学习法
- 银光类似web visio的节点连线控件Essential Diagram免费下载地址
- 《炬丰科技-半导体工艺》电子半导体白皮书
- log4j的使用和log4j过时问题的解决
- 墨客和宁波市政府签订战略合作协议
- 中国银联mPOS通用技术安全分析和规范解读
- 简单的PPO算法笔记
- codeforces 766 C Mahmoud and a Message
- QGIS入门实验十六 迁徙图制作
- 生产者消费者问题实践