在写项目的时候让加上个信用卡申请的功能,完全调用前端的url(心里窃喜,没我啥事~就加个链接的事)。
一顿操作之后功能完了O(∩_∩)O~~
看了一眼功能,恩~没毛病,妥妥的,提交。
BUT!!!给了产品经理,惊喜的发现有BUG!(我曾一度怀疑所有产品的手机都是“针对”Android的,一定是!!!)
产品那的效果是这样的:
what。。。按钮变小了。。。拿起自己的测试机一顿操作,额。。。还真是10次打开有3,4次都出现了类似的情况,拿起IOS的手机看了看,额。。没问题。好吧我改~
但是怎么改?原生的webview 有很多的未知的坑啊,这个时候想到了腾讯家有X5浏览器!https://x5.tencent.com/
这咱还怕啥!整起!又是一顿操作过后完成了。看一看效果
恩,没毛病~妥妥的。好了给产品吧。
BUT!!!产品说:Android啊,这个页面怎么打开的这么慢啊?(你们看,这是不是故意针对我小叮当!!!)
啥?打开的慢?我的测试机跑的好好的啊,嗖嗖的,拿来手机一看,臣卜木曹!跳转的时候会有很长时间的UI卡顿。腾讯大大连你也。。。哎。。。解决吧。一顿查询一顿操作~恩解决了。
具体操作(有兴趣的小伙伴可以看看):https://x5.tencent.com/tbs/technical.html#/detail/sdk/1/a59880aa-06a6-4eca-aad0-836778652f89
呵~没啥能难的到我小叮当的!
你以为八阿哥会轻易的放过你吗?错了!测试机上跑的嗖嗖的,产品的手机也嗖嗖的,到了我自己的手机上,额。。还是卡顿。(你不光针对我小叮当!你还刁难我胖虎!!!叔可忍,虎不能忍)。我这还要把每个手机都给你整一遍么?时间不等人啊。算了,换成原生的webview吧。。
经过哥们儿的指导修改代码,在Activity的生命周期中加入webview的周期方法
@Override
protected void onResume() {
super.onResume();
mWebView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mWebView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mWebView.destroy();
}
奇迹发生了,好了!!!
点了点之后,点到交通银行卡那再次跳转web
哈??网页显示不全???但是其他网页都没问题啊。算了,习惯了。。
添加了一行神奇的代码:
mWebView.getSettings().setDomStorageEnabled(true);
再来看看效果:
恩~好的完成了。哔哩哔哩 (゜-゜)つロ 干杯~-*bilibili
下面粘贴出我的代码:
布局代码
activity_apply_web_view
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.ApplyWebViewActivity">
<RelativeLayout
android:id="@+id/common_titlebar_apply_web"
android:layout_width="match_parent"
android:layout_height="@dimen/y88"
android:background="@color/color_white_title">
<ImageView
android:layout_width="@dimen/x38"
android:layout_height="@dimen/y38"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:src="@mipmap/icon_back" />
<TextView
android:id="@+id/title_tv_apply_web"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="标题"
android:textColor="@color/color_black_text"
android:textSize="@dimen/commit_zero_text" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/apply_web"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/y1" />
<ProgressBar
android:id="@+id/apply_web_pb"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="3dp"
android:layout_alignParentTop="true"
android:progressDrawable="@drawable/progress_webview" />
</RelativeLayout>
<!--<com.zt_declaration.ztdeclarationform.view.X5WebView-->
<!--android:id="@+id/x5_apply_web"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="match_parent" />-->
</LinearLayout>
ProgressBar: progress_webview
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<solid android:color="@android:color/transparent" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<solid android:color="#457DD7" />
</shape>
</clip>
</item>
</layer-list>
java:
public class ApplyWebViewActivity extends BaseActivity implements View.OnClickListener {
private WebView mWebView;
private ProgressBar mProgressBar;
private boolean isAnimStart = false;
private int currentProgress;
private String title;
private String url;
private RelativeLayout rlBack;
private TextView tvTitle;
// private X5WebView x5WebView;
@Override
protected void setContentView() {
setContentView(R.layout.activity_apply_web_view);
}
@Override
public void initData() {
Intent dataIntent = getIntent();
url = dataIntent.getStringExtra("url");
title = dataIntent.getStringExtra("title");
}
@Override
public void initBar() {
StatusBarTextUtil.blackTextStatusBar(this, true);
}
@Override
protected void onResume() {
super.onResume();
mWebView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mWebView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mWebView.destroy();
}
@Override
public void initView() {
mWebView = findViewById(R.id.apply_web);
mProgressBar = findViewById(R.id.apply_web_pb);
tvTitle = findViewById(R.id.title_tv_apply_web);
rlBack = findViewById(R.id.common_titlebar_apply_web);
if (title != null) {
tvTitle.setText(title);
} else {
tvTitle.setText("");
}
// // 在调用TBS初始化、创建WebView之前进行如下配置,以开启优化方案
// HashMap<String, Object> map1 = new HashMap<String, Object>();
// map1.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
// QbSdk.initTbsSettings(map1);
//
// initX5(); // 启动预加载服务
////
//// HashMap<String, Object> map = new HashMap<String, Object>();
//// map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
//// QbSdk.initTbsSettings(map);
//
// // 在调用TBS初始化、创建WebView之前进行如下配置,以开启优化方案
// HashMap<String, Object> map = new HashMap<String, Object>();
//
// // 配置不使用多进程策略,即该方案仅在Android 5.1+系统上生效。
// map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, false);
// QbSdk.initTbsSettings(map);
//
//
// x5WebView = findViewById(R.id.x5_apply_web);
// x5WebView.loadUrl(url);
mWebView.setWebViewClient(new WebViewClient());
mWebView.getSettings().setJavaScriptEnabled(true);// 启用JS
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
lodurl(view, url);
return false;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
mProgressBar.setVisibility(View.VISIBLE);
mProgressBar.setAlpha(1.0f);
}
});
// 获取网页加载进度
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
currentProgress = mProgressBar.getProgress();
if (newProgress >= 100 && !isAnimStart) {
// 防止调用多次动画
isAnimStart = true;
mProgressBar.setProgress(newProgress);
// 开启属性动画让进度条平滑消失
startDismissAnimation(mProgressBar.getProgress());
} else {
// 开启属性动画让进度条平滑递增
startProgressAnimation(newProgress);
}
}
});
WebSettings webSettings = mWebView.getSettings();
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
// webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
mWebView.loadUrl(url);
mWebView.setOnKeyListener(new View.OnKeyListener() { // TODO
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
}
return false;
}
});
}
private void initX5() {
Intent intent = new Intent(this, PreLoadX5Service.class);
startService(intent);
}
@Override
public void initListener() {
rlBack.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.common_titlebar_apply_web: // 返回
if (mWebView.canGoBack()) {
mWebView.goBack();
} else {
CacheActivity.finishSingleActivity(ApplyWebViewActivity.this);
}
// if (x5WebView.canGoBack()) {
// x5WebView.goBack();
// } else {
// CacheActivity.finishSingleActivity(ApplyWebViewActivity.this);
// }
break;
}
}
/**
* 返回键监听
*
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// if (keyCode == KeyEvent.KEYCODE_BACK) {
// if (x5WebView != null && x5WebView.canGoBack()) {
// x5WebView.goBack();
// return true;
// } else {
// return super.onKeyDown(keyCode, event);
// }
// }
// return super.onKeyDown(keyCode, event);
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (mWebView != null && mWebView.canGoBack()) {
mWebView.goBack();
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
return super.onKeyDown(keyCode, event);
}
/**
* progressBar递增动画
*/
private void startProgressAnimation(int newProgress) {
ObjectAnimator animator = ObjectAnimator.ofInt(mProgressBar, "progress", currentProgress, newProgress);
animator.setDuration(300);
animator.setInterpolator(new DecelerateInterpolator());
animator.start();
}
/**
* progressBar消失动画
*/
private void startDismissAnimation(final int progress) {
ObjectAnimator anim = ObjectAnimator.ofFloat(mProgressBar, "alpha", 1.0f, 0.0f);
anim.setDuration(1500); // 动画时长
anim.setInterpolator(new DecelerateInterpolator()); // 减速
// 关键, 添加动画进度监听器
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float fraction = valueAnimator.getAnimatedFraction(); // 0.0f ~ 1.0f
int offset = 100 - progress;
mProgressBar.setProgress((int) (progress + offset * fraction));
}
});
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
// 动画结束
mProgressBar.setProgress(0);
mProgressBar.setVisibility(View.GONE);
isAnimStart = false;
}
});
anim.start();
}
public void lodurl(final WebView webView, final String url) {
new Thread(new Runnable() {
@Override
public void run() {
webView.loadUrl(url);
}
});
}
}