您的位置:首页 > 移动开发 > Android开发

项目需求之Android 监听键盘的弹起和隐藏&setVisibility(View.GONE)方法失效

2016-09-07 22:44 387 查看
最近比较忙咯,因为在做密码密码管理模块,所以一直在跟EditText打交道,我也写了几篇跟EditText有关的博客了,今天又遇到需求了,需要监听系统键盘的弹起和隐藏。

需求大致是这样的:

1、当键盘弹起的时候,也就是EditText可以输入的时候,这个时候“编辑”按钮消失,反之显示。

2、当点击“编辑”按钮的时候“编辑”按钮执行一个缩放动画,动画完毕后消失。

先说说我之前监听EditText获取和失去焦点的方法,后面看了EditText源码,被自己蠢哭了,不过也没关系,因为我知道了怎么监听键盘的弹起和隐藏,赚到了哈~!!!

1、监听键盘的弹起和隐藏

因为键盘是系统弹出来的,查阅了官方文档,也没有什么方法是可以监听键盘的弹起和隐藏的,但是通过写上一篇博客 Activity下WindowSoftInputMode属性详解,我们知道,当设置为android:windowSoftInputMode=”stateHidden|adjustResize”的时候,系统总会调整当前界面的布局,从而使输入的内容可见,所以当布局被调整的时候,会回调布局的onLayoutChange方法,所以我们只需要加上监听就可以了。

方法一:

findViewById(R.id.id_rl).addOnLayoutChangeListener(this);
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
Log.e("TAG", "onLayoutChange:");
if (oldBottom != 0 && bottom != 0 && (oldBottom - bottom > 0)) {
//软键盘弹起
Log.e("TAG", "onLayoutChange: 软键盘弹起");
mButton.setVisibility(View.GONE);
} else if (oldBottom != 0 && bottom != 0 && (bottom - oldBottom > 0)) {
//当以前的现在的bottom-以前的bottom>0的时候也就是软件盘关闭
Log.e("TAG", "onLayoutChange: 软件盘关闭");
mButton.setVisibility(View.VISIBLE);
}
}


2、监听EditText的焦点变换

id_edit2= (EditText) findViewById(R.id.id_edit2);
id_edit2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){
//获取焦点的时候
}else{
//失去焦点的时候
}
}
});


3、当觉得自己快完成任务的时候,当做动画然后动画结束让当前View消失的时候发现bug了,setVisibility(View.GONE)方法失效了,

a=new ScaleAnimation(0f,1f,0f,1f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
a.setDuration(1000);
a.setFillAfter(true);
a.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {

}

@Override
public void onAnimationEnd(Animation animation) {
mButton.setVisibility(View.GONE);
}

@Override
public void onAnimationRepeat(Animation animation) {

}
});
}


解决方法:

简单点说就是,当一个View执行动画的时候,当前View肯定是可见的,因为如果不可见的话动画也就没有意义了,问题就出在a.setFillAfter(true);这个代码上,因为动画结束的时候肯定是可见的,a.setFillAfter(true);会保持最后一个状态,

public void onAnimationEnd(Animation animation) {
mButton.setVisibility(View.GONE);
}


我们在这个方法中设置GONE会晚于a.setFillAfter(true);执行,所以会导致mButton.setVisibility(View.GONE);失效,

1、我们把a.setFillAfter(false);设置false

2、在GONE之前清一下动画

mButton.clearAnimation();
mButton.setVisibility(View.GONE);


OK~!总结完咯,为了弄清原理,苦逼的看了一番View的源码,被Google那群疯子虐哭了,慢慢成长~!!加油~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐