安卓软键盘的处理
来源:互联网 发布:免费注册淘宝账号官网 编辑:程序博客网 时间:2024/06/18 09:57
安卓软键盘的处理是相对来说比较复杂的,首先说说我的需求是软键盘弹起的时候我需要显示布局1,收起的时候我显示布局2,再者我需要保持软键盘的状态,无论是按home键还是锁屏键,走的时候是什么状态回来的时候就是什么状态,就这个两个需求,先说第一个吧,监听软键盘的弹出和隐藏;
这个网上一搜一大堆,我推荐个链接http://www.jb51.net/article/111647.htm;监听软键盘的状态一定要设置android:windowSoftInputMode="adjustResize"
public class MainActivity extends AppCompatActivity implements View.OnLayoutChangeListener { private View rootView; //软件盘弹起后所占高度阀值 private int keyHeight = 0; private View layout1; private View layout2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); keyHeight =getScreenHeight(this) / 3; rootView = findViewById(R.id.rootView); rootView.addOnLayoutChangeListener(this); layout1 = findViewById(R.id.layout1); layout2 = findViewById(R.id.layout2); } @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { //弹出 if ( oldBottom != 0 && bottom != 0 && (oldBottom - bottom > keyHeight)) { Log.e("flag--","MainActivity--onLayoutChange--29"+" "+"弹出"); layout2.setVisibility(View.VISIBLE); layout1.setVisibility(View.GONE); } else if ( oldBottom != 0 && bottom != 0 && (bottom - oldBottom > keyHeight)) {//收起 Log.e("flag--","MainActivity--onLayoutChange--33"+" "+"收起"); layout2.setVisibility(View.GONE); layout1.setVisibility(View.VISIBLE); } } /** * 获得屏幕高度,考虑到了虚拟按键 * * @param aContext 上下文 * @return 屏幕宽度 */ public static int getScreenHeight(Context aContext) { WindowManager manager = (WindowManager) aContext.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics out = new DisplayMetrics(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { manager.getDefaultDisplay().getRealMetrics(out); } else { manager.getDefaultDisplay().getMetrics(out); } return out.heightPixels; }}
在项目中我是用的第一种,这样就可以轻松实现第一个需求了。
现在说说第二个需求,你会发现,你按home键的时候 键盘是正常的不用处理,你按锁屏键的时候,键盘会自动收起,看到这个现象不知道你有没有监听按锁屏键呢?我觉得这个很麻烦,我们可以在可以用一个Boolean值记录这个软键盘的状态,在onresume的时候根据这个状态进行恢复就可以了,按照这个思路你会发现,你在按锁屏键的时候,软键盘自动收起了这个记录的就不准了,怎么办呢?我的思路是在在息屏的时候ostop的时候onLayoutchange()这个方法不回调,即:
@Overrideprotected void onStop() { super.onStop(); isStop=true;}
@Overridepublic void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { //弹出 if (isStop){ return; } if (!isShown && oldBottom != 0 && bottom != 0 && (oldBottom - bottom > keyHeight)) { isShown = true; mSearchRecommendLayout.setVisibility(View.VISIBLE); mResultLayout.setVisibility(View.GONE); } else if (isShown && oldBottom != 0 && bottom != 0 && (bottom - oldBottom > keyHeight)) {//收起 isShown = false; if (isFinsh){ finish(); } }}现在是解决了锁屏不改变的问题了,也带来了一个更大的问题了,只要走了onstop这个方法,onLayoutChange这个方法就不走了,这个怎么办呢,我是这么做的,就是在onresume的时候用handler延时个300毫秒把isStop这个值改为false就可以了。
两个需求现在已经完成了,在补充两点:
1:软键盘手动弹出隐藏的时候的flags的值代表什么意思,推荐一个比较好的博文
http://blog.csdn.net/ccpat/article/details/46717573
2:还有就是当你把
android:imeOptions="actionSearch"的时候,你监听点击搜索的时候,
editText.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER) { } return false; }});
这样写,你会发现这个判断会进来两次,如果你再里面进行的是网络请求,你会发现会请求翻倍,是因为在按下和抬起的时候都会回调,所以你可以再加一个判断条件,event.getAction()看你是要down还是up事件,就可以了。
就这么多了,折磨人的软键盘,如果有问题,欢迎评论交流
- 安卓软键盘的处理
- 安卓软键盘的关闭
- 安卓开发中关于软键盘处理的一些问题
- 安卓开发-软键盘
- 安卓软键盘相关
- 安卓软键盘调用
- 隐藏安卓软键盘
- 安卓软键盘隐藏
- 安卓 隐藏软键盘
- 安卓监控软键盘的消失事件
- 安卓布局被软键盘顶上去的解决方案
- 安卓软键盘的显示与隐藏
- 安卓进入页面避免软键盘弹出的解决办法
- 安卓软键盘弹出和隐藏的监听
- 安卓软键盘弹出,遮挡控件的问题
- 安卓点击软键盘的回车即提交数据并隐藏软键盘
- Android 软键盘的处理
- 安卓如何关闭软键盘?
- Muiltset和MultiMap学习--如何让map存放相同的key
- React ES5与ES6语法写法比较
- [日推荐] 『无忧育儿说』养育孩子就是这么简单!
- lua lib 的编译
- 对double类型中存在-0.0的数据检验
- 安卓软键盘的处理
- 总结
- C++ template高阶技巧(4)---《C++ Templates》
- 【swift】关于po命令不显示问题 error: <EXPR>:3:1: error: use of unresolved identifier
- ES6 Arrow functions
- css元素隐藏各种方式原理及display:none和visibility:hidden
- 阿里前端笔试题
- How To Set HANA ODBC Connection Properties
- C#自定义RSA加密解密及RSA签名和验证封装类