Android WebView 精简Demo

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012246458/article/details/88656726

需求

这里放一个Android WebView的简单Demo,不过这个Demo是我这边特别精简的,能基本上适用于我这边大部分的页面显示和功能问题,多余的代码和配置都被我删掉了;

注释掉的代码是不同的情景模式,不做注释了。

代码

package zql.h5;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.webkit.JavascriptInterface;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity  implements View.OnClickListener {
    public static final String INTENT_URL = "intent_url";//请求连接
//    public static final String INTENT_PARAMS_STRING = "intent_params_string";//请求参数字符串
//    public static final String INTENT_REQUEST_WAY = "intent_request_way";//请求方式(POST/GET)

    private WebView wvShow;
    private TextView tv_back_title;
    private TextView tv_title;
    private ImageView iv_back;
    private TextView tv_right;

    public ValueCallback<Uri[]> uploadMessage;
    private ValueCallback<Uri> mUploadMessage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
        setContentView(R.layout.activity_main);

        tv_back_title = (TextView) findViewById(R.id.tv_back_title);
        tv_title = (TextView) findViewById(R.id.tv_title);
        iv_back = (ImageView) findViewById(R.id.iv_back);
        tv_right = (TextView) findViewById(R.id.tv_right);

        iv_back.setOnClickListener(this);
        tv_back_title.setOnClickListener(this);
        tv_right.setOnClickListener(this);

        initView();
        initData();
    }

    private void initData() {

//        //外部:GET & POST形式
//        String intentUrl = getIntent().getStringExtra(INTENT_URL);
//        String intentParams = getIntent().getStringExtra(INTENT_PARAMS_STRING);
//        String intentRequestWay = getIntent().getStringExtra(INTENT_REQUEST_WAY);

//        Log.e("WebView请求", "连接:" + intentUrl + "....." + "参数:" + intentParams);
//
//        if (intentRequestWay.equals("GET")) {
//            wvShow.loadUrl(intentUrl + "?" + intentParams);//get请求
//        } else if (intentRequestWay.equals("POST")) {
//            wvShow.postUrl(intentUrl, intentParams.getBytes());//post请求
//        } else {
//            Toast.makeText(MainActivity.this, "请求方式参数错误", Toast.LENGTH_SHORT).show();
//        }

        //链接
        wvShow.loadUrl("https://bht.mandao.com/front/#/v2/chb/payment/21ecf0bbe1ee4eb0a8027ff234e7e65c/ASSURE_PAY");//get请求

//        //Html源码
//        String htmlData = "<!DOCTYPE html>\n" +
//                "<html>\n" +
//                "<head>\n" +
//                "    <meta charset=\"utf-8\">\n" +
//                "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no\">\n" +
//                "    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n" +
//                "    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n" +
//                "    <title>修改资料</title>\n" +
//                "   <script src=\"./jquery-1.8.3.js\"></script>\n" +
//                "</head>\n" +
//                "\n" +
//                "<body>\n" +
//                "   <div className=\"image-uploader\">\n" +
//                "    <input id=\"imgInput\" className=\"imgInput\" type=\"file\" accept=\"image/*\" />\n" +
//                "    <img id=\"imgShow\" className=\"imgShow\" />\n" +
//                " </div>\n" +
//                "\n" +
//                "<script>  \n" +
//                "  $('#imgInput').change(function () {\n" +
//                "   readURL(this);\n" +
//                "});\n" +
//                "\n" +
//                "function readURL(input){\n" +
//                "  if (input.files && input.files[0]) {\n" +
//                "    const reader = new FileReader();\n" +
//                "    reader.readAsDataURL(input.files[0]);\n" +
//                "    reader.onload = (e) => {\n" +
//                "        $('#imgShow').attr('src', e.target.result);\n" +
//                "      };\n" +
//                "   };\n" +
//                " };\n" +
//                "</script>\n" +
//                "</body>\n" +
//                "</html>";
//
//        Log.e("网页", htmlData);
//
//        wvShow.loadDataWithBaseURL(null, htmlData, "text/html", "utf-8", null);
    }

    private void initView() {
        wvShow = (WebView) findViewById(R.id.wv_body);
        wvShow.getSettings().setJavaScriptEnabled(true);//允许与js 交互
        wvShow.getSettings().setDefaultTextEncodingName("utf-8");//支持中文
        wvShow.addJavascriptInterface(new JsInterface(this), "androidYZH");//在js中调用本地java方法(androidYZH这个是js和安卓之间的约定,js:window.androidYZH.closeH5)
        wvShow.getSettings().setDomStorageEnabled(true);//允许缓存、开启DOM(双重重定向白屏问题)
        wvShow.setWebViewClient(new WebViewClient() {
            //覆盖shouldOverrideUrlLoading 方法
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url == null) return false;
                try {
                    if (url.startsWith("http:") || url.startsWith("https:")) {
                        view.loadUrl(url);
                        return true;
                    } else {//如果不是http和https就用系统浏览器打开
                        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                        startActivity(intent);
                        return true;
                    }
                } catch (Exception e) { //防止crash (如果手机上没有安装处理某个scheme开头的url的APP, 会导致crash)
                    return false;
                }
            }
        });
        wvShow.setWebChromeClient(new WebChromeClient() {//监听网页加载
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
//                if (newProgress == 100) {
//                    // 网页加载完成
//                    pbProgress.setVisibility(View.GONE);
//                } else {
//                    // 加载中
//                    pbProgress.setProgress(newProgress);
//                }
                super.onProgressChanged(view, newProgress);
            }

        });

    }

    @Override
    public void onClick(View v) {
        int i = v.getId();
        if (i == R.id.iv_back) {
            if (wvShow.canGoBack()) {
                wvShow.goBack();
            } else {
                finish();
            }
        } else if (i == R.id.tv_back_title) {
            finish();
        }
    }

    /**
     * js调用原生方法
     */
    private class JsInterface {
        private Context mContext;

        public JsInterface(Context context) {
            this.mContext = context;
        }

        @JavascriptInterface
        public void closeH5(String name) {//关闭sdk
            Log.e("网页", "方法入参:" + name);

            finish();
        }

        @JavascriptInterface
        public void downloadFile(String name) {//下载文件
            Log.e("网页", "方法入参:" + name);

            //这里是把地址用默认浏览器打开,在浏览器中下载
            Uri uri = Uri.parse(name);
            Intent intent = new Intent();
            intent.setAction("android.intent.action.VIEW");
            intent.setData(uri);
            startActivity(intent);
        }
    }

    //重写Activity的onKeyDown事件,判断当用户按下“返回”按钮,webview返回上一页
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && wvShow.canGoBack()) {
            wvShow.goBack();
            return true;
        } else {
            finish();
        }

        return super.onKeyDown(keyCode, event);
    }

}

猜你喜欢

转载自blog.csdn.net/u012246458/article/details/88656726