//卸载初始化里面,解决
WebViewBugUtil.assistActivity(mActivity);
/**
* Data: 2019/6/11
* Description:
* 解决webview 键盘弹起,布局被遮挡的问题(转载)
* 填坑 android系统 5497BUG AndroidBug5497Workaround
* 参考资料:http://blog.csdn.net/u010897392/article/details/53171071
* @author: zhanggf
*/
public class WebViewBugUtil {
public static void assistActivity(Activity activity) {
new WebViewBugUtil(activity);
}
private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
private int contentHeight;
private boolean isfirst = true;
private Activity activity;
private int statusBarHeight;
private WebViewBugUtil(Activity activity) {
//获取状态栏的高度
int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
this.activity = activity;
FrameLayout content = (FrameLayout)activity.findViewById(android.R.id.content);
mChildOfContent = content.getChildAt(0);
//界面出现变动都会调用这个监听事件
mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
if (isfirst) {
contentHeight = mChildOfContent.getHeight();//兼容华为等机型
isfirst = false;
}
possiblyResizeChildOfContent();
}
});
frameLayoutParams = (FrameLayout.LayoutParams)
mChildOfContent.getLayoutParams();
}
//重新调整跟布局的高度
private void possiblyResizeChildOfContent() {
int usableHeightNow = computeUsableHeight();
//当前可见高度和上一次可见高度不一致 布局变动
if (usableHeightNow != usableHeightPrevious) {
//int usableHeightSansKeyboard2 = mChildOfContent.getHeight();//兼容华为等机型
int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
int heightDifference = usableHeightSansKeyboard - usableHeightNow;
if (heightDifference > (usableHeightSansKeyboard / 4)) {
// keyboard probably just became visible
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
//frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
frameLayoutParams.height = usableHeightSansKeyboard - heightDifference + statusBarHeight;
} else {
frameLayoutParams.height = usableHeightSansKeyboard -heightDifference;
}
} else {
frameLayoutParams.height = contentHeight;
}
mChildOfContent.requestLayout();
usableHeightPrevious = usableHeightNow;
}
}
/** * 计算mChildOfContent可见高度 ** @return */
private int computeUsableHeight() {
Rect r = new Rect();
mChildOfContent.getWindowVisibleDisplayFrame(r);
return (r.bottom - r.top);
}
}
整体修改的两种方式,项目中有遇到不流畅,偶现第一次进入白屏,添加了如下加速解决
//只添加软件加速,测试可能会导致滑动卡顿且会弹得问题
if (Build.VERSION.SDK_INT >= 19) {//硬件加速器的使用
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
但是后期又遇到了频繁进入加载白屏,且H5内部跳转无法跳转或卡死现象,经过百度查找测试通过如下方式解决,—父布局添加硬件加速,webView添加软件加速,啥原因有知道的欢迎赐教
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/parent_bg"
android:layerType="hardware"
android:orientation="vertical">
<wendu.webviewjavascriptbridge.WVJBWebView
android:id="@+id/wb_main"
android:layerType="software"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
//基础设置
WebSettings webSettings = webView.getSettings();
webSettings.setTextZoom(100);//设置字体缩放比例
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);// 适应屏幕
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);//适应内容大小
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
// 启动webview的html5的本地存储功能。
webSettings.setDomStorageEnabled(true);
webSettings.setAppCacheMaxSize(1024 * 1024 * 8);
String appCachePath = activity.getApplicationContext().getCacheDir().getAbsolutePath();
webSettings.setAppCachePath(appCachePath);
webSettings.setAllowFileAccess(true);
webSettings.setAppCacheEnabled(true);
//webview加载https页面图片不能显示问题
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
//只在debuggable为true时候允许WebView远程调试
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (activity.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) {
WebView.setWebContentsDebuggingEnabled(true);
}
}
//找不到网页net:err_unknown_url_scheme:一般情况是由于协议不同引起的,添加下面的设置,如果不 是HTTP或HTTPS协议则由浏览器进行解读
webSettings.setUserAgentString("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0");
官方描述:https://developer.umeng.com/docs/66632/detail/66975?um_channel=sdk
看完文档,表示“需要保证线性不交叉”这个就懵逼了,怎么能保证线性不交叉,一般都直接写在BaseFragment里面,
而在首页tab切换,就有问题了。
想过去掉ViewPager预加载功能,没测试,有需要可以试试,用了一种比较粗暴的方式解决了
解决方式:
再Activity里面切换时强制配对onPageEnd结束上一个,再onPageStart开始新的Fragment
private String mPageName;
//初始化默认赋值:
mPageName = "MineFragment";
case R.id.tv_home:
switchTab(view.getId(), HOMEPAGE_TAG);
MobclickAgent.onEvent(this, UmengConstants.main_tab_home);
MobclickAgent.onPageEnd(mPageName);
mPageName = "HomeIndexFragment";
MobclickAgent.onPageStart(mPageName);
break;
case R.id.tv_msg: //消息
switchTab(view.getId(), MSGPAGE_TAG);
MobclickAgent.onEvent(this, UmengConstants.main_tab_session);
MobclickAgent.onPageEnd(mPageName);
mPageName = "SessionListFragment";
MobclickAgent.onPageStart(mPageName);
break;
case R.id.tv_find: //发现
switchTab(view.getId(), FINDPAGE_TAG);
MobclickAgent.onEvent(this, UmengConstants.main_tab_find);
MobclickAgent.onPageEnd(mPageName);
mPageName = "OnlineFragment";
MobclickAgent.onPageStart(mPageName);
break;
case R.id.tv_me:
switchTab(view.getId(), MINEPAGE_TAG);
MobclickAgent.onEvent(this, UmengConstants.main_tab_mine);
MobclickAgent.onPageEnd(mPageName);
mPageName = "MineFragment";
MobclickAgent.onPageStart(mPageName);
break;
官方文档写在前面:
BaseActivity
// Activity页面onResume函数重载
@Override
public void onResume() {
super.onResume();
MobclickAgent.onResume(this); // 不能遗漏
}
// Activity页面onResume函数重载
@Override
public void onPause() {
super.onPause();
MobclickAgent.onPause(this); // 不能遗漏
}
BaseFragment:
// Fragment页面onResume函数重载
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(getClass().getSimpleName()); //统计页面("MainScreen"为页面名称,可自定义)
}
// Fragment页面onResume函数重载
@Override
public void onPause() {
super.onPause();
MobclickAgent.onPageEnd(getClass().getSimpleName());
}
@Override
public void onResume() {
super.onResume();
MobclickAgent.onPageStart(mPageName);
}
@Override
public void onPause() {
super.onPause();
MobclickAgent.onPageEnd(mPageName);
}