关于android嵌套webview等相关问题

web开发越来越活跃,大多app内嵌套html已经是非常平常的事情,在android中有许多js加载问题及微信支付问题,还有显示问题,以下是我这几天的学习所整理的一些方法,在这里发布以下

打开webview ,url为地址,replace("\\", "") 去除多余的斜杠,android接受json的地址会多出来几条斜杠,这样会造成web无法显示的问题

startActivity(WebActivity.newIntent(this, url.replace("\\", ""),"积分商城"));
xlm(主要就这一句,不多BB)
<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
 
 

java代码

 
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
webview = findviewbyid(R.id.webview); iniview();//引用控件 setwebviewbackgrand();//服务,中有加载处理方法和打开微信支付方法
}
博主比较懒,简单的代码就不备注了
 
 
private void iniview() {
    web_view = (WebView) findViewById(R.id.webView);
    weiuri = new String(stringExtra);
    WebSettings webSettings = web_view.getSettings();//初始化WebSettings 获取web服务
    webSettings.setPluginState(WebSettings.PluginState.ON);//过期方法,
    webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
    webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
    webSettings.setJavaScriptEnabled(true);//启用js
    webSettings.setBlockNetworkImage(false);//解决图片不显示
    webSettings.setAppCacheEnabled(true);//设置是否打开。默认关闭,即,H5的缓存无法使用。
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
    webSettings.setAllowFileAccess(true);// 设置允许访问文件数据
    webSettings.setSupportZoom(true);//支持缩放
    webSettings.setBuiltInZoomControls(true);//进行控制缩放。由于某些原因需要在该activity的onDestroy方法里面调用webView.destroy()。当进入该webview并且进行缩放操作时,退出该activity程序崩溃
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//自动打开窗口
    if (URL.endsWith(".html")) {
        web_view.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    } else {
        web_view.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    }
    webSettings.setDomStorageEnabled(true);//设置支持DomStorage
    webSettings.setDatabaseEnabled(true);//设置支持本地存储
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){//这个很重要 不接受了
        webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);

    }
    web_view.requestFocus();//缓存
    //设置响应js 的Alert()函数
    web_view.setWebChromeClient(new WebChromeClient() {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
            AlertDialog.Builder b = new AlertDialog.Builder(WebActivity.this);
            b.setTitle("提示");
            b.setMessage(message);
            b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    result.confirm();
                }
            });
            b.setCancelable(false);
            b.create().show();
            return true;
        }

        //设置响应js 的Confirm()函数
        @Override
        public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
            AlertDialog.Builder b = new AlertDialog.Builder(WebActivity.this);
            b.setTitle("confirm");
            b.setMessage(message);
            b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    result.confirm();
                }
            });
            b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    result.cancel();
                }
            });
            b.create().show();
            return true;
        }

        //设置响应js 的Prompt()函数
        @Override
        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {
            final View v = View.inflate(WebActivity.this, R.layout.prompt_dialog, null);
            ((TextView) v.findViewById(R.id.prompt_message_text)).setText(message);
            ((EditText) v.findViewById(R.id.prompt_input_field)).setText(defaultValue);
            AlertDialog.Builder b = new AlertDialog.Builder(WebActivity.this);
            b.setTitle("prompt");
            b.setView(v);
            b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String value = ((EditText) v.findViewById(R.id.prompt_input_field)).getText().toString();
                    result.confirm(value);
                }
            });
            b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    result.cancel();
                }
            });
            b.create().show();
            return true;
        }
    });
    web_view.loadUrl(weiuri);//打开webview weiuri是连接地址

}
 
 
 
 
这里主要用于微信支付操作,正常android自带的web是打不开微信,这里做的就是简单的拦截费网站页面和跳转微信支付的操作
private void setwebviewbackgrand() {
    web_view.setPictureListener(new WebView.PictureListener() {
        @Override
        public void onNewPicture(WebView view, Picture picture) {

            //移除动画或者删除背景图片
        }
    });
    web_view.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode,
                                    String description, String failingUrl) {

            //网页加载失败的处理,一般是出错图片,跳转到出错处理页面
            super.onReceivedError(view, errorCode, description,failingUrl);
        }
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // TODO Auto-generated method stub
            //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器

            if (url.startsWith("http:") || url.startsWith("https:")){
                view.loadUrl(url);

                Map<String, String> extraHeaders = new HashMap<String, String>();
                extraHeaders.put("Referer", "http://www.jxzwawa.cn");
                view.loadUrl(url, extraHeaders);
                return false;
            }else {
                if (url.startsWith("weixin://wap/pay?")) {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                }
                return true;
            }

        }
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if (view.getTitle().length() != 0) {
                mTitleBar.setTitle(view.getTitle());
            }

            WebActivity.this.setTitle(view.getTitle());
            //网页加载结束的处理,可以停止动画

        }
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {

            super.onPageFinished(view, url);
            if (view.getTitle().length() != 0) {
                mTitleBar.setTitle(view.getTitle());
            }

            WebActivity.this.setTitle(view.getTitle());
            //网页加载开始的处理,开始动画
        }
    });
}
顺便带一个退出操作
 
 
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    if (keyCode == KeyEvent.KEYCODE_BACK && web_view.canGoBack()) {
        web_view.goBack();
        return true;
    } else {

        finish();

    }
    return true;
}


 
 
xml.prompt_dialog
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/prompt_message_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/prompt_input_field"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minWidth="250dp"
        android:selectAllOnFocus="true"
        android:scrollHorizontally="true"/>
</LinearLayout>

代码比较简单 站过去就能用 不给dome了 希望各路大神多多指点。

如果帮助到各位请留言告诉我 如果没帮助到了 如果我知道会告诉你 不过 我项目已经不用这个了 用qq游览器的内核 比自带的块很多倍 



猜你喜欢

转载自blog.csdn.net/qq_34468274/article/details/80826426