Android使用Webview显示页面以及点击跳转startActivity问题

以下是个人拙见,大神可直接忽略。

      直接奔入主题,android的一个webview控件相信大家都特别熟悉了,可以用来加载显示网页,像商城的商品图文详情就可以用网页很快实现,但是最近项目中遇到不一样的问题,商品首页用webview显示,点击某一个商品或者商品分类startactivity跳转自身的界面,首页混杂一部分网页加载肯定会遇到界面显示卡顿,显示慢的问题,不过既然需求是这样,也只能照做了。

      显示一个网页就不说了,首先,先优化一下显示速度问题,也就是显示文字和图片的先后,在oncreate方法加上下面代码:

    if (Build.VERSION.SDK_INT >= 19) {
            mWebView.getSettings().setLoadsImagesAutomatically(true);
        } else {
            mWebView.getSettings().setLoadsImagesAutomatically(false);
        }

  在WebViewClient中的onPageFinished方法加入:

if (!mWebView.getSettings().getLoadsImagesAutomatically()) {
                mWebView.getSettings().setLoadsImagesAutomatically(true);
            }

  由于可能导致网页显示错误,如果想自定义,在onReceivedError方法中加载自己在本地写的html.

  

  其次就是要实现startActivity点击跳转android界面了,下面两句话极其重要:

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new WebAppInterface(
MyWebShopActivity.this), "startActivity");

  让你的webview支持页面js交互,其中"startActivity" 可以更改,和网页js方法保持一致就行了,然后写入你要点击实现的效果了,要显示一句话,或者跳转界面等...

public class WebAppInterface {
        Context mContext;
        WebAppInterface(Context c) {
            mContext = c;
        }

        @JavascriptInterface
        public void jump_product_detail(final String id) {
           //TODO 处理代码
        }
    }

  我这里就是下的跳转点击的商品,"jump_product_detail"和上面的"startActivity"一样可以更改,也要保持一致。

  最后,在你自定义处理代码中说一下可能遇到的问题,前端在做网页的时候会加上每一个点击的id,也就是标识,比如你加载时url是"https://www.baidu.com/" , 点击后会变为"https://www.baidu.com/:01" 这样多了id的url,可是这时webview会加载一次这个url,但是这个url是不存在的,所以我们就要重新加载一次原来的URL,注意这里不能用mWebView.loadUrl(url)来加载了,看下面的log输出就知道了:

java.lang.Throwable: Warning: A WebView method was called on thread 'WebViewCoreThread'. All WebView methods must be called on the UI thread. Future versions of WebView may not support use on other threads.

  处理方法就是改为:


mWebView.post(new Runnable() {

    @Override
    public void run() {
        mWebView.loadUrl(url); //url为初始的值
    }
});

代替mWebView.loadUrl(url)来加载。

  同样,在你用startActivity启动界面时会出现错误Uncaught Error: Error calling method on NPObject,只需要修改为:


Handler mHandler = new Handler();
    mHandler.post(new Runnable() {

    @Override
    public void run() {
       startActivity(new Intent(action, uri));
            
});

就能较好的解决以上两个容易出现的问题了。

补充说明:webview加载的网页如果用户是点击了里面的内容到了子网页,但是用户点击返回键不想直接关闭当前界面,而是返回上一页怎么办了?这里只需要监听一下webview有没有能够返回上一页就行了,有就返回上一页,没有就关闭当前界面。如下:

@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
			webView.goBack(); // goBack()表示返回WebView的上一页面
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}


webview 加载本地html : 

WebSettings webSettings = mWebView.getSettings();
		webSettings.setJavaScriptEnabled(true);
		mWebView.addJavascriptInterface(new WebAppInterface(MainActivity.this),
				"loadok");
		mWebView.loadUrl("file:///android_asset/web.html");

public class WebAppInterface {
		Context mContext;

		WebAppInterface(Context c) {
			mContext = c;
		}

		@JavascriptInterface
		public void toastMessage(String id) {
			Toast.makeText(mContext, "通过Natvie传递的Toast:" + id,
					Toast.LENGTH_LONG).show();
		}
	}
assets文件夹的web.html
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Title</title>  
    <h1>native本地调用js</h1>  
    <input type="button" value="js调native" οnclick="ok()">  
</head>  
<body>  
<script type="text/javascript">  
function ok() {  
    loadok.toastMessage("11111");
}  
</script>  
<script type="text/javascript">  
document.addEventListener( "plusready", function(){ 
 	var Context = plus.android.importClass("android.content.Intent");
    var Main = plus.android.runtimeMainActivity();
    var shareIntent=new Context(Context.ACTION_SEND);
    plus.android.invoke(shareIntent,"setType","text/plain");
    plus.android.invoke(shareIntent,"putExtra",Context.EXTRA_TEXT,"aaaaa");
    Main.startActivity(Context.createChooser(shareIntent,"vvvvvvvvvv"));
}, false );
</script> 

</body>  
</html> 

ok, 先这样,还有什么问题想知道的可以在下方评论。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值