##android使用EditText的时候总是遇到一些很不爽的问题: 无图无真相。。 1.点击屏幕其他的任何位置,软键盘不会隐藏 2.软键盘会把输入框遮盖掉

3.软键盘会把界面顶起 由于对键盘和EditText的种种不爽,就弄了一个以下东西 ###一.首先要知道怎么用代码控制软键盘的显示隐藏 以下是软键盘显示隐藏类 KeyBoardUtils.java


import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;import static android.content.Context.INPUT_METHOD_SERVICE;/*** @author laijian* @version 2017/8/29* @Copyright (C)下午2:55 , Suntektech*/
public class KeyBoardUtils {/*** 打开软键盘** @param mEditText* @param mContext*/public static void openKeybord(EditText mEditText, Context mContext) {InputMethodManager imm = (InputMethodManager) mContext.getSystemService(INPUT_METHOD_SERVICE);imm.showSoftInput(mEditText, InputMethodManager.RESULT_SHOWN);imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);}/*** 关闭软键盘** @param mEditText* @param mContext*/public static void closeKeybord(EditText mEditText, Context mContext) {InputMethodManager imm = (InputMethodManager) mContext.getSystemService(INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);}/*** des:隐藏软键盘,这种方式参数为activity** @param activity*/public static void hideInputForce(Activity activity) {if (activity == null || activity.getCurrentFocus() == null)return;((InputMethodManager) activity.getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);}/*** 打开键盘**/public static void showInput(Context context, View view) {InputMethodManager imm = (InputMethodManager) context.getSystemService(INPUT_METHOD_SERVICE);if (imm != null) {view.requestFocus();imm.showSoftInput(view, 0);}}}复制代码

这个类没什么好说的

###二.要知道软键盘弹出时的高度 获取软键盘弹出的高度是为了创建一个自适应的dialog,键盘弹出时就会在键盘上方显示一个带EditText的dialog 以下是获取软键盘高度的类 KeyBoardHeightUtils.java


import android.app.Activity;
import android.graphics.Rect;
import android.os.Build;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;/*** @author laijian* @version 2017/8/31* @Copyright (C)上午11:11 , Suntektech*/
public class KeyBoardHeightUtils {private View mChildOfContent;//activity 的布局Viewprivate int usableHeightPrevious;//activity的View的可视高度private KeyBoardHigthListener keyBoardHigthListener;public static KeyBoardHeightUtils setKeyBoardHeigthListener(Activity activity, KeyBoardHigthListener keyBoardHigthListener) {return new KeyBoardHeightUtils(activity, keyBoardHigthListener);}public void removeKeyboardHeightListener() {if (mChildOfContent == null) {return;}if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {mChildOfContent.getViewTreeObserver().removeGlobalOnLayoutListener(globalLayoutListener);} else {mChildOfContent.getViewTreeObserver().removeOnGlobalLayoutListener(globalLayoutListener);}}private KeyBoardHeightUtils(final Activity activity, KeyBoardHigthListener keyBoardHigthListener) {this.keyBoardHigthListener = keyBoardHigthListener;
//获取安卓activity的最顶级控件FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);//mChildOfContent = content.getChildAt(0);//监听视图高度变化      mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(globalLayoutListener);
//点击父控件隐藏软键盘mChildOfContent.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {KeyBoardUtils.hideInputForce(activity);}});}private ViewTreeObserver.OnGlobalLayoutListener globalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {possiblyResizeChildOfContent();}};private void possiblyResizeChildOfContent() {int usableHeightNow = computeUsableHeight();if (usableHeightNow != usableHeightPrevious) {int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();int heightDifference = usableHeightSansKeyboard - usableHeightNow;
//为了去除无谓的干扰,限制下高度if (heightDifference > (usableHeightSansKeyboard / 4)) {keyBoardHigthListener.keyBoardHigthListener(usableHeightSansKeyboard - heightDifference, true, mChildOfContent);} else {keyBoardHigthListener.keyBoardHigthListener(usableHeightSansKeyboard, false, mChildOfContent);}usableHeightPrevious = usableHeightNow;}}
//获取控件在屏幕的可视高度,就是界面除去了标题栏、除去了被软键盘挡住的部分,所剩下的矩形区域private int computeUsableHeight() {Rect r = new Rect();mChildOfContent.getWindowVisibleDisplayFrame(r);return (r.bottom - r.top);}interface KeyBoardHigthListener {//这个回调类写的不好,请自行修改void keyBoardHigthListener(int heigth, boolean showKeyBoard, View contentView);}}复制代码

这代码也不多 也不难理解

###三.要知道EditText控件是否被遮盖 判断EditText控件是否被遮盖是为了弹出一个带EditText 的 dialog 这样就不会说EditText被覆盖后 不知道输入了些什么内容

以下是检测EditText控件是否被覆盖

 private boolean checkViewVisiable() {Rect localRect = new Rect();boolean visiable = edtextVew.getLocalVisibleRect(localRect);System.out.println("visiable=" + visiable);return visiable;}
复制代码

以下是判断获取的焦点是不是EditText

  View childView = contentView.findFocus();if (childView != null) {if (childView instanceof EditText) {edtextVew = (EditText) childView;
复制代码

以下类就是关键类,判断EditText是否被覆盖,弹dialog等 KeyBoardUI.java


import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Rect;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.DisplayMetrics;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;import com.univercityapp.convergelibrary.widget.NullMenuEditText;/*** @author laijian* @version 2017/8/31* @Copyright (C)上午11:57 , Suntektech*/
public class KeyBoardUI implements KeyBoardHeightUtils.KeyBoardHigthListener {private EditText edtextVew;//activity的输入框private Activity activity;private Dialog mDialog;private NullMenuEditText popuEdtext;//popu的输入框private int screenWeight = 0;//屏幕宽度private KeyBoardHeightUtils keyBoardHeightUtils;public static KeyBoardUI buildKeyBoardUI(Activity activity) {return new KeyBoardUI(activity);}private KeyBoardUI(Activity activity) {this.activity = activity;getScreen();initDialog();keyBoardHeightUtils = KeyBoardHeightUtils.setKeyBoardHeigthListener(activity, this);}private void getScreen() {DisplayMetrics dm = new DisplayMetrics();activity.getWindowManager().getDefaultDisplay().getMetrics(dm);screenWeight = dm.widthPixels;}private void initDialog() {LayoutInflater inflater = (LayoutInflater) activity.getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);View popuView = inflater.inflate(ResourcesUtils.getLayoutResources(activity, "popuwindow"), null);RelativeLayout populay = (RelativeLayout) popuView.findViewById(ResourcesUtils.getIdResources(activity, "popu_lay"));popuEdtext = (NullMenuEditText) popuView.findViewById(ResourcesUtils.getIdResources(activity, "ed_text"));mDialog = new Dialog(activity, ResourcesUtils.getStyleResources(activity, "dialog"));mDialog.setContentView(popuView);populay.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {KeyBoardUtils.closeKeybord(popuEdtext, activity);mDialog.dismiss();}});}@Overridepublic void keyBoardHigthListener(int heigth, boolean showKeyBoard, View contentView) {if (showKeyBoard) {if (contentView != null) {View childView = contentView.findFocus();if (childView != null) {if (childView instanceof EditText) {edtextVew = (EditText) childView;if (!checkViewVisiable()) {mDialog.show();
//重新调整dialog的高度Window dialogWindow = mDialog.getWindow();WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值p.height = heigth; p.width = screenWeight; dialogWindow.setAttributes(p);dialogWindow.setWindowAnimations(ResourcesUtils.getStyleResources(activity, "PopupAnimation"));onEdChange();KeyBoardUtils.openKeybord(edtextVew, activity);} else {if (mDialog != null) {mDialog.dismiss();}}}}}} else {if (mDialog != null) {mDialog.dismiss();}}}private boolean checkViewVisiable() {Rect localRect = new Rect();boolean visiable = edtextVew.getLocalVisibleRect(localRect);System.out.println("visiable=" + visiable);return visiable;}private void onEdChange() {String hintStr = "";String text = "";if (!TextUtils.isEmpty(edtextVew.getText())) {text = edtextVew.getText().toString();}if (!TextUtils.isEmpty(edtextVew.getHint())) {hintStr = edtextVew.getHint().toString();}popuEdtext.findFocus();popuEdtext.setInputType(edtextVew.getInputType());popuEdtext.setHint(hintStr);popuEdtext.setText(text);popuEdtext.setSelection(text.length());popuEdtext.setMaxEms(edtextVew.getMaxEms());popuEdtext.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {edtextVew.setText(s);edtextVew.setSelection(s.length());}@Overridepublic void afterTextChanged(Editable s) {}});popuEdtext.setOnEditorActionListener(new TextView.OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {if (actionId == 0) {KeyBoardUtils.closeKeybord(popuEdtext, activity);mDialog.dismiss();return true;}return false;}});}public void removeKeyboardHeightListener() {keyBoardHeightUtils.removeKeyboardHeightListener();}
}复制代码

###四.禁止EditText长按出复制粘贴 NullMenuEditText.java


/*** @author laijian* @version 2017/8/30* @Copyright (C)下午5:26 , Suntektech*/import android.content.Context;
import android.util.AttributeSet;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;/*** Created by jianjun.lin on 16/4/12.*/
public class NullMenuEditText extends EditText {boolean canPaste() {return false;}boolean canCut() {return false;}boolean canCopy() {return false;}boolean canSelectAllText() {return false;}boolean canSelectText() {return false;}boolean textCanBeSelected() {return false;}public NullMenuEditText(Context context, AttributeSet attrs) {super(context, attrs);setLongClickable(false);setTextIsSelectable(false);setCustomSelectionActionModeCallback(new ActionMode.Callback() {@Overridepublic boolean onCreateActionMode(ActionMode mode, Menu menu) {return false;}@Overridepublic boolean onPrepareActionMode(ActionMode mode, Menu menu) {return false;}@Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {return false;}@Overridepublic void onDestroyActionMode(ActionMode mode) {}});}@Overridepublic boolean onTextContextMenuItem(int id) {return true;}
}复制代码

###五.相关xml资源 还有一些动画效果资源 popup_enter.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="100"android:fromYDelta="1"android:toYDelta="0" /><alphaandroid:duration="100"android:fromAlpha="0.0"android:toAlpha="1.0" />
</set>复制代码

popup_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="100"android:fromYDelta="0"android:toYDelta="1" /><alphaandroid:duration="100"android:fromAlpha="1.0"android:toAlpha="0.0" />
</set>复制代码

styles资源

 <style name="PopupAnimation" mce_bogus="1" parent="android:Animation"><item name="android:windowEnterAnimation">@anim/popup_enter</item><item name="android:windowExitAnimation">@anim/popup_exit</item></style><style name="dialog" parent="android:style/Theme.Dialog"><item name="android:background">#00000000</item><item name="android:windowBackground">@android:color/transparent</item><item name="android:windowNoTitle">true</item><item name="android:windowIsFloating">true</item><item name="android:backgroundDimEnabled">false</item></style>
复制代码

layout文件 popuwindow.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/popu_lay"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#00000000"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:background="#ffffff"android:orientation="vertical"android:paddingTop="2dp"><com.univercityapp.convergelibrary.widget.NullMenuEditTextandroid:id="@+id/ed_text"android:layout_width="match_parent"android:layout_height="36dp"android:paddingLeft="6dp"android:background="#ffffff"android:gravity="center_vertical"android:inputType="text"android:maxLines="1"android:scrollHorizontally="true"android:textSize="16sp" /></LinearLayout>
</RelativeLayout>
复制代码

###六.获取R的资源utils ResourcesUtils.java


import android.content.Context;
import android.content.res.Resources;import java.lang.reflect.Field;/*** Created by laijian code on 2016-10-19.*/
public class ResourcesUtils {public static int getIdResources(Context context, String idName) {Resources res = context.getResources();return res.getIdentifier(idName, "id", context.getPackageName());}public static int getDrawableResources(Context context, String drawableName) {Resources res = context.getResources();return res.getIdentifier(drawableName, "drawable", context.getPackageName());}public static int getColorResources(Context context, String colorName) {Resources res = context.getResources();return res.getIdentifier(colorName, "color", context.getPackageName());}public static int getStringResources(Context context, String stringName) {Resources res = context.getResources();return res.getIdentifier(stringName, "string", context.getPackageName());}public static int getLayoutResources(Context context, String LayoutName) {Resources res = context.getResources();return res.getIdentifier(LayoutName, "layout", context.getPackageName());}public static int getAttrResources(Context context, String attrName) {Resources res = context.getResources();return res.getIdentifier(attrName, "attr", context.getPackageName());}public static int getStyleResources(Context context, String attrName) {Resources res = context.getResources();return res.getIdentifier(attrName, "style", context.getPackageName());}/*** context.getResources().getIdentifier 无法获取到 styleable 的数据** @param name* @return* @paramcontext*/public static int getStyleable(Context context, String name) {return ((Integer) getResourceId(context, name, "styleable")).intValue();}/*** 获取 styleable 的 ID 号数组** @param name* @return* @paramcontext*/public static int[] getStyleableArray(Context context, String name) {return (int[]) getResourceId(context, name, "styleable");}/*** 对于 context.getResources().getIdentifier 无法获取的数据 , 或者数组* <p/>* 资源反射值** @param name* @param type* @return* @paramcontext*/private static Object getResourceId(Context context, String name, String type) {String className = context.getPackageName() + ".R";try {Class<?> cls = Class.forName(className);for (Class<?> childClass : cls.getClasses()) {String simple = childClass.getSimpleName();if (simple.equals(type)) {for (Field field : childClass.getFields()) {String fieldName = field.getName();if (fieldName.equals(name)) {System.out.println(fieldName);return field.get(null);}}}}} catch (Exception e) {e.printStackTrace();}return null;}
}复制代码

###七.如何使用 使用非常简单,在需要的activity的oncreat方法添加

KeyBoardUI.buildKeyBoardUI(this);
复制代码

在AndroidManifest.xml用到上面方法的activity添加

android:windowSoftInputMode="adjustResize"
复制代码

谢谢观看完以上内容

欢迎访问个人博客

github地址,喜欢就star下

Android软键盘与EditText近乎完美的交互相关推荐

  1. Android软键盘遮挡EditText问题

    最近在调试App过程遇到软件盘遮挡EditText的问题,特记录下问题的解决过程 在4.4版本上,如果EditText设置了gravity="center|right"其中之一且同 ...

  2. rn android软键盘遮挡布局处理,完美解决RN 键盘遮挡问题

    当输入框在底部的时候, 唤起键盘会造成遮挡问题,解决方法如下: class ForumDetail extends React.Component { render(){ let behavior = ...

  3. android自定义键盘遮挡,Android软键盘遮挡的四种完美解决方案

    一.问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时 ...

  4. Android 软键盘功能键(EditText)

    夜深了.废话不多说了,项目需要改变Android软键盘右角下的功能键! 好了!先看图?还是代码?.... 还是先代码.然后效果图! 代码: public class MainActivity exte ...

  5. Android软键盘手动显示、隐藏、布局上移和EditText上移

    主要实现:Android软键盘手动显示.隐藏.布局上移和EditText上移 AndroidManifest.xml <?xml version="1.0" encoding ...

  6. Android 软键盘显示隐藏判断

    Android软键盘始终感觉是个BUG,难缠 用起来不顺手,每次应用版本涉及到相关问题,总是很尴尬 只能静下心好好梳理一下 1. 软键盘显示原理 软键盘的本质是什么?软键盘其实是一个Dialog In ...

  7. Android软键盘隐藏,遮挡EidtText解决办法

    一.自动弹出软键盘 Timer timer=new Timer(); timer.schedule(new TimerTask() { public void run() { InputMethodM ...

  8. android软键盘enter键

    enter键,回车键,电脑键盘上enter键就有多种响应.android软键盘也不例外 你在EditText上输入以后,想在下一行输入框输入,可能需要去点击下一行输入框,让它获取焦点,也可能要隐藏软键 ...

  9. android软键盘上添加一个按钮

    android软键盘上添加一个按钮: 第一种 我们在根布局的最底部添加一个按钮,利用布局中的ScrollView在软键盘弹出的时候 将底部的按钮挤压到软键盘上边,先看效果图: 看代码: <?xm ...

  10. Android软键盘工具类

    Android软键盘工具类 public class SoftKeyboardUtils {/*** 隐藏或显示软键盘* 如果现在是显示调用后则隐藏 反之则显示*/public static void ...

最新文章

  1. matlab length_《Matlab - Robotics System Toolbox》学习笔记(2)
  2. 新版PyTorch发布!新增TorchScript API,扩展ONNX导出……4大功能更新值得关注
  3. Linux疑难杂症解决方案100篇(六)-SHELL编程条件判断和流程控制
  4. Java黑皮书课后题第7章:***7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能相互攻击(没有两个皇后在同行、同列、同一对角线)。编写程序显示一个解决方案
  5. JavaScript 散集合(HashArray)
  6. Spring REST实践之HATEOAS
  7. php中文件读写总结,PHP读取文件_2014.5.26的总结
  8. ArcGIS图层和要素的过滤显示
  9. vm12 和 centos 下载地址
  10. 如何对计算机c盘进行清理,C盘清理,小编教你怎么给电脑C盘进行清理
  11. 随机分组c语言,用C/C++进行随机分组的实现教程,分组教程
  12. 2020年全国城市信息模型(CIM)新政策汇总
  13. less css 视频教程
  14. UI设计师必备的五款界面设计工具
  15. 蓝标智能营销转型之战 ——Oracle Eloqua 市场营销云助力蓝标盈云迎战全渠道营销...
  16. 额外域控与主域控之间的数据同步
  17. 配置树莓派中文环境 及解决 no write since last change
  18. python字典一键多值_python一键多值
  19. 论文翻译:Pose estimation at night in infrared images using a lightweight multi-stage attention network
  20. python excelwriter保存路径_从Excel中解救你!如何用Python实现报表自动化

热门文章

  1. AngularJS transclude 理解及例子
  2. wpf中的默认右键菜单中的复制、粘贴、剪贴等没有本地化的解决方式
  3. Quartz job Cluster下报错
  4. 根据一个单词找所有的兄弟单词的思想如何处理
  5. 1.maven下仅shiro框架对shiro的测试使用
  6. 硬盘安装Windows需要了解的DOS命令
  7. form表单问题记录
  8. 【Window】使用技巧
  9. VC.【转】窗口置于前台并激活的方法
  10. asp.net 在repeater控件中加按钮