遇到的问题
同事的项目在做登陆的时候遇到个问题,就是弹出软键盘把按钮遮挡了。网上好多方法 试了一遍效果都不好。
那么我们该如何解决这个问题呢?
解决思路
- 弄个scrollview,让软键盘把scrollview顶上去
- 不弄scrollview。让软键盘把 输入框顶上去,其他的图片用属性动画移走或者不显示。
效果图
用到的技术
- 监听软键盘 开启和关闭
- 获取控件的高度
- 属性动画
代码实现
-监听软键盘 开启关闭代码
这个方法需要在mainfest里面加一句代码
android:windowSoftInputMode="adjustResize"
package wang.com.logininputdemo;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.RelativeLayout;
/**
* 一个继承自RelativeLayout的输入法监听布局
*
* Created by zhaowei on 15/7/31.
*/
public class InputMethodLayout extends RelativeLayout {
private static final String TAG = "InputMethodLayout";
/** 初始化状态 **/
public static final byte KEYBOARD_STATE_INIT = -1;
/** 隐藏状态 **/
public static final byte KEYBOARD_STATE_HIDE = -2;
/** 打开状态 **/
public static final byte KEYBOARD_STATE_SHOW = -3;
private boolean isInit; // 是否为初始化状态
private boolean hasKeybord; // 标识是否打开了软键盘
private int viewHeight; // 布局高度
private onKeyboardsChangeListener keyboarddsChangeListener; // 键盘状态监听
public InputMethodLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public InputMethodLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public InputMethodLayout(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
/**
* 设置软键盘状态监听
*
* @param listener
*/
public void setOnkeyboarddStateListener(onKeyboardsChangeListener listener) {
keyboarddsChangeListener = listener;
}
/**
* 布局状态发生改变时,会触发onLayout
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (!isInit) {
isInit = true;
viewHeight = b;
keyboardSateChange(KEYBOARD_STATE_INIT);
} else {
viewHeight = viewHeight < b ? b : viewHeight;
}
if (isInit && viewHeight > b) {
hasKeybord = true;
keyboardSateChange(KEYBOARD_STATE_SHOW);
}
if (isInit && hasKeybord && viewHeight == b) {
hasKeybord = false;
keyboardSateChange(KEYBOARD_STATE_HIDE);
}
}
/**
* 切换软键盘状态
*
* @param state
* // 状态
*/
public void keyboardSateChange(int state) {
if (keyboarddsChangeListener != null) {
keyboarddsChangeListener.onKeyBoardStateChange(state);
}
}
/**
* 软键盘状态切换监听
*
*
*/
public interface onKeyboardsChangeListener {
public void onKeyBoardStateChange(int state);
}
}
还有一个中方法监听 软键盘是否打开
rl.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
//当键盘弹出隐藏的时候会 调用此方法。
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//获取当前界面可视部分
SecondActivity.this.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
//获取屏幕的高度
int screenHeight = SecondActivity.this.getWindow().getDecorView().getRootView().getHeight();
//此处就是用来获取键盘的高度的, 在键盘没有弹出的时候 此高度为0 键盘弹出的时候为一个正数
heightDifference = screenHeight - r.bottom;
if (heightDifference > screenHeight / 3) {
startAnimation();
flag = true;
} else {
backAnimation();
flag = false;
}
}
});
这个例子的核心其实就是监听软键盘。其他的没什么了。直接取下载代码看下就明白了。
代码在我的github 欢迎start。fork
https://github.com/wanghao200906/logininputdemo/tree/master
尊重原创:http://blog.csdn.net/wanghao200906/article/details/51113461#t3