1、新建类AndroidBug5497Workaround:

package com.sswl.sdk.utils;import android.app.Activity;import android.graphics.Rect;import android.os.Build.VERSION;import android.os.Build.VERSION_CODES;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.view.ViewTreeObserver;import android.widget.FrameLayout;/** * 用于修复Android 5497BUG,即adjustResize与全屏不能共存 * 

* 使用方法: setContentView(); 后调用 AndroidBug5497Workaround.assistActivity(this); * * @author Administrator */public class AndroidBug5497Workaround { /** * 适用于调整activity内的布局大小 */ public static void assistActivity(Activity activity) { new AndroidBug5497Workaround(activity); } /** * 适用于调整popuwindow/dialog布局大小 * * @param activity * @param contentView */ public static void assistActivity(Activity activity, ViewGroup contentView) { new AndroidBug5497Workaround(activity, contentView); } private Activity activity; private View mChildOfContent; private int usableHeightPrevious; private ViewGroup.LayoutParams frameLayoutParams; private boolean isRootContentView = false; //适用于调整activity内的布局大小 private AndroidBug5497Workaround(Activity activity) { this.activity = activity; isRootContentView = false; FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); //获取当前界面的根布局 mChildOfContent = content.getChildAt(0); if (mChildOfContent == null) { mChildOfContent = (FrameLayout) activity.findViewById(android.R.id.content); } //在根布局增加布局变化的监听 mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { possiblyResizeChildOfContent(); } }); frameLayoutParams = (ViewGroup.LayoutParams) mChildOfContent.getLayoutParams(); } //适用于调整popuwindow/dialog布局大小 private AndroidBug5497Workaround(Activity activity, ViewGroup contentView) { this.activity = activity; isRootContentView = true; //获取当前界面的根布局 mChildOfContent = contentView; //在根布局增加布局变化的监听 mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { possiblyResizeChildOfContent(); } }); frameLayoutParams = (ViewGroup.LayoutParams) mChildOfContent.getLayoutParams(); } private void possiblyResizeChildOfContent() { //可见的高度 int usableHeightNow = computeUsableHeight(); if (usableHeightNow != usableHeightPrevious) { //根布局的高度 int rootViewHeight = mChildOfContent.getRootView().getHeight(); //这个判断是为了解决19之前的版本不支持沉浸式状态栏导致布局显示不完全的问题 if (VERSION.SDK_INT < VERSION_CODES.KITKAT) { Rect frame = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int statusBarHeight = frame.top; rootViewHeight -= statusBarHeight; } int heightDifference = Math.abs(rootViewHeight - usableHeightNow); //当前可见区域大小不足根布局大小的5/6时,认为是软键盘弹出 if (heightDifference > (rootViewHeight /6)) {// Log.e("min77","computeUsableHeight heightDifference > rootViewHeight / 6"); // keyboard probably just became visible frameLayoutParams.height = usableHeightNow; } else { // keyboard probably just became hidden frameLayoutParams.height = rootViewHeight; } //更新布局大小 mChildOfContent.setLayoutParams(frameLayoutParams); mChildOfContent.requestLayout(); Log.i("min77", "computeUsableHeight 刷新 rootViewHeight = "+rootViewHeight+" ,frameLayoutParams.height = " + frameLayoutParams.height + " , usableHeightPrevious = " + usableHeightPrevious); usableHeightPrevious = usableHeightNow; } } /** * 计算当前界面可见的高度 */ private int computeUsableHeight() { Rect frame = new Rect(); mChildOfContent.getWindowVisibleDisplayFrame(frame); Log.i("min77", "computeUsableHeight = " + (frame.bottom - frame.top)); return (frame.bottom - frame.top); }}

2、在嵌有webview的activity的setContentView之前加以下代码即可解决:

AndroidBug5497Workaround.assistActivity(this);

或者在popuwindow show之后加入以下代码:

 //这个必须设置,否则无法将布局顶上去AndroidBug5497Workaround.assistActivity(mActivityRef.get(),mContentView);

【高能提醒】

假如上述代码显示软键盘弹出时候,没有看到布局大小有变化,即没有调用到possiblyResizeChildOfContent();,那么有可能是你AndroidManifest.xml的activity设置了 android:windowSoftInputMode="adjustResize",需要去掉android:windowSoftInputMode才生效

更多相关文章

  1. android第三天--AbsoluteLayout绝对布局
  2. Android Layout Tricks #3: Optimize with stubs(Android 布局技
  3. Android 关于显示键盘,布局错乱网上顶的问题
  4. android如何用代码实现界面ui
  5. android 开发 简单的页面布局
  6. android 界面属性
  7. android 中获取屏幕大小
  8. Android 访问网络连接设置界面

随机推荐

  1. 天欲亡我,非战之罪!怪吾创业前未阅《三国》
  2. 全都是泡沫?勿把“晚轮”错当IPO!
  3. Apple Watch这个产品让我爆血管,但为什么
  4. 拿走,产品经理没个秘密武器哪好意思跟人打
  5. 商业模式的七种严刑逼供方式
  6. 资深VC: VC的“增值平台”就是一坨狗屎
  7. 资深投资人全力反击: VC增值平台从来就不
  8. 深度分析: Google 和 Apple 从来就不是死
  9. 总裁发话: 创业者应该如何避免陷入
  10. 藏不住了,Flink 未来发展的最新方向在这里