先贴代码
package com.miss.plugin;
import android.app.Activity;
import android.graphics.Rect;
import android.os.Build;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
public class KeyBoardWorkaround {
private final String TAG = "KeyBoardWorkaround";
// activity 的根视图
private View rootView;
// 记录根视图的显示高度
private int rootViewVisibleHeight;
private boolean hasInit = false;
private int initHeight;
private int initWidth;
// 是否发生旋转
private boolean hasRotate = false;
private FrameLayout.LayoutParams frameLayoutParams;
private int statusBarHeight;
/**
*
* @param activity
*/
public void solve(Activity activity) {
// tpc : 获取activity的根视图
rootView = activity.getWindow().getDecorView();
// tpc : 获取状态栏的高度,此部分做机型适配
int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
final View mChildOfContent = content.getChildAt(0);
frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
// tpc : 监听视图树中全局布局发生改变或视图树种某个视图可视状态发生改变
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// tpc : 获取当前根视图在屏幕上显示的大小
Rect rect = new Rect();
rootView.getWindowVisibleDisplayFrame(rect);
int visibleHeight = rect.height();
Log.e(TAG, "visibleHeight = " + visibleHeight);
Log.e(TAG, "visibleWidth = " + rect.width());
if (!hasInit) {
initHeight = rect.height();
initWidth = rect.width();
hasInit = !hasInit;
}
if (rootViewVisibleHeight == 0) {
rootViewVisibleHeight = visibleHeight;
return;
}
// 根视图显卡显示高度没有变化,可以看做软键盘状态没有改变
if (rootViewVisibleHeight == visibleHeight) {
return;
}
// 发生了旋转
if (visibleHeight == initWidth) {
rootViewVisibleHeight = visibleHeight;
frameLayoutParams.height = initWidth;
frameLayoutParams.width = initHeight;
mChildOfContent.requestLayout();
hasRotate = true;
return;
}
// 旋转恢复
if (hasRotate) {
rootViewVisibleHeight = visibleHeight;
frameLayoutParams.height = initHeight;
frameLayoutParams.width = initWidth;
hasRotate = false;
return;
}
// 根视图高度变小超过200,软键盘显示
if (rootViewVisibleHeight - visibleHeight > 200) {
// TODO 键盘展示逻辑,机型适配
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
frameLayoutParams.height = visibleHeight + statusBarHeight;
} else {
frameLayoutParams.height = visibleHeight;
}
mChildOfContent.requestLayout();
rootViewVisibleHeight = visibleHeight;
return;
}
// 根视图高度变大超过200,软键盘隐藏
if (visibleHeight - rootViewVisibleHeight > 200) {
// TODO 键盘收起逻辑
frameLayoutParams.height = initHeight;
mChildOfContent.requestLayout();
rootViewVisibleHeight = visibleHeight;
return;
}
}
});
}
}
调用
在有WebView的活动的onCreate()方法调用,也可以把这个抽成静态方法调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
KeyBoardWorkaround keyBoardWorkaround = new KeyBoardWorkaround();
keyBoardWorkaround.solve(this);
}
横竖屏切换后键盘无法正常弹出
这个方法是厂商提供的,具体原因不清楚!
最初以为键盘无法弹出时因为webview焦点丢失,DispatchTouchEvent中给了焦点,没效果
// 横竖屏切换时调用
mWebView.clearFocus();