放弃放开放 2019-10-21 10:52 采纳率: 0%
浏览 609

Android 继承BridgeWebView 写个自定义的webview。部分手机加载高度为0

public class AdWebView extends com.github.lzyzsd.jsbridge.BridgeWebView {
private Context mContext;
private MoonthimpModel moonthimpModel;
private boolean messageHeight;
private String mTitle;
private PregressChange pregressChange;

public AdWebView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.mContext = context;

    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AdWebView);

    messageHeight = a.getBoolean(
            R.styleable.AdWebView_messageHeight, false);
}


public void setPregressChange(PregressChange pregressChange) {
    this.pregressChange = pregressChange;
}

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

Mobile mobile = new Mobile();

public void initWebView(String url) {

    WebSettings webSettings = getSettings();
    //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
    webSettings.setJavaScriptEnabled(true);
    //设置自适应屏幕,两者合用
    webSettings.setDomStorageEnabled(true);
    // 解决Android 5.0上Webview默认不允许加载Http与Https混合内容
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        //两者都可以
        webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
    }
    //设置自适应屏幕,两者合用
    webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
    webSettings.setLoadWithOverviewMode(true);// 缩放至屏幕的大小
    webSettings.setAllowFileAccess(true); //设置可以访问文件
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
    webSettings.setLoadsImagesAutomatically(true);//支持自动加载图片
    webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
    addJavascriptInterface(this, "Android_kks");
    if (messageHeight) {
        addJavascriptInterface(mobile, "mobile");
    }
    if (Build.VERSION.SDK_INT >= 19) {
        getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    }
    //设置不用系统浏览器打开,直接显示在当前Webview

    setWebViewClient(new BridgeWebViewClient(this) {

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            LogUtils.e("onPageFinished");
            if (messageHeight) {
                mobile.onGetWebContentHeight();
            }
        }

        @Override
        public void onReceivedSslError(WebView view,
                                       SslErrorHandler handler, SslError error) {
            // super.onReceivedSslError(view, handler, error); 父类的默认处理方式,内部是handler.cancel(),必须去除
            handler.proceed();// 接受所有网站的证书
            // handleMessage(Message msg);// 进行其他处理
        }


    });
    setWebChromeClient(new WebChromeClient() {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            if (pregressChange != null) {
                if (newProgress == 100) {
                    //加载完毕进度条消失
                    pregressChange.onComplete();
                } else {
                    //更新进度
                    pregressChange.onProgress(newProgress);
                }

            }

            super.onProgressChanged(view, newProgress);
        }

        @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
            if (title != null && pregressChange != null) {
                // pregressChange.onTitle(title);
            }
        }
    });
     loadUrl(url);
    //    loadUrl("https://h5.ruiccm.com/testls/190627/index.html");
    //     loadUrl("file:///android_asset/demo1.html");

    String localVersion = "";
    try {
        PackageInfo packageInfo = KeKeShiApp.getApp()
                .getPackageManager()
                .getPackageInfo(KeKeShiApp.getApp().getPackageName(), 0);
        localVersion = packageInfo.versionName;
        LogUtils.d("TAG", "本软件的版本号。。" + localVersion);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

    AdUserInfoBean src = new AdUserInfoBean();
    src.setDevice_uuid(PushAgent.getInstance(mContext).getRegistrationId());
    if (AppSharedPrefs.getUserInfo() != null && AppSharedPrefs.getUserInfo().getUserinfo() != null && AppSharedPrefs.getUserInfo().getUserinfo().getTel() != null) {
        UserBean.UserInfo userinfo = AppSharedPrefs.getUserInfo().getUserinfo();
        src.setPhoneNum(userinfo.getTel());
        src.setBabybirthday(userinfo.getBabybirthday());
        src.setBabyname(userinfo.getBabyname());
        src.setBabysex(userinfo.getBabysex());
        src.setIsvip((AppSharedPrefs.getUserInfo().getIsvip() ? 1 : 0) + "");
        src.setMoonage(userinfo.getMoonage());
        src.setRelative(userinfo.getRelative());
        src.setUser_uuid(userinfo.getUuid());

    }
    src.setDeviceid(PushAgent.getInstance(mContext).getRegistrationId());
    src.setVersion(localVersion);
    src.setPhone_type("Android");
    src.setPhone_version(SystemUtil.getSystemModel() + "," + SystemUtil.getSystemVersion());
    //有方法名的都需要注册Handler后使用
    registerHandler("userInfo", new BridgeHandler() {
        @Override
        public void handler(String data, CallBackFunction function) {
            Log.i("liuw", "html返回数据为:" + data);
            function.onCallBack("Native已经接收到数据:" + data + ",请确认!");
        }
    });


    //应用启动后初始化数据调用,js处理方法connectWebViewJavascriptBridge(function(bridge)
    callHandler("userInfo", new Gson().toJson(src), new CallBackFunction() {
        @Override
        public void onCallBack(String data) {
            Log.e("callbace", "successs");
        }
    });


}

public String getmTitle() {
    return mTitle;
}

private class Mobile {
    @JavascriptInterface
    public void onGetWebContentHeight() {
        post(new Runnable() {
            @Override
            public void run() {
                measure(0, 0);
                int measuredHeight = getMeasuredHeight();
                LogUtils.d("measuredHeight", measuredHeight + "");
                SharedPreferences kekeshi = mContext.getSharedPreferences("kekeshi", MODE_PRIVATE);
                if (measuredHeight != 0) {
                    kekeshi.edit().putInt("measuredHeight", measuredHeight).commit();
                }
                LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) getLayoutParams();

                params.height = measuredHeight;
                if (measuredHeight == 0) {
                    int measuredHeight1 = kekeshi.getInt("measuredHeight", 4000);
                    params.height = measuredHeight1;

                }
                params.weight = LinearLayout.LayoutParams.MATCH_PARENT;
                setLayoutParams(params);
            }
        });

    }
}

public void close() {
    stopLoading();
    clearHistory();
    removeAllViews();
    destroy();
}

public void resume() {
    //   resumeTimers();
    // onResume();
}

public void pause() {
    //    onPause();
    //  pauseTimers();
}

public void load(String url) {
    initWebView(url);

}





public interface PregressChange {
    void onComplete();

    void onProgress(int progress);

    void onTitle(String title);
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥50 树莓派安卓APK系统签名
    • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
    • ¥65 汇编语言除法溢出问题
    • ¥15 Visual Studio问题
    • ¥20 求一个html代码,有偿
    • ¥100 关于使用MATLAB中copularnd函数的问题
    • ¥20 在虚拟机的pycharm上
    • ¥15 jupyterthemes 设置完毕后没有效果
    • ¥15 matlab图像高斯低通滤波
    • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗