美文网首页APIcloud
SuperWebView 记录我遇到的问题解决方案

SuperWebView 记录我遇到的问题解决方案

作者: 一个冬季 | 来源:发表于2017-10-24 11:33 被阅读19次

    今天我开始会写出我弄SuperWebView所遇到的问题的解决方案,我会持续更新的

    1.顶部跟状态栏重合
    2.启动A项目却一直启动的是B项目
    3.下拉刷新无法使用
    4.模块获取相同的ID是否会错乱
    5.superwebView 如何加载外部网址
    6.使用execScript(回调) 传递参数
    7.html页面之间传递参数
    8.div或者其它标签里面,自定义参数字段,然后获取
    9.使用api.download下载文件
    10.使用函数function函数回调(callBack)传递参数
    11.从Activity打开widget文件夹下面某一个Html页面
    12.从Activity里面无法找到widget文件夹下面的某一个Html页面
    13.使用addEventListener传递参数
    14.同一个功能里面含有2个相同的Frame页面,我是否可以共用同一个Frame页面
    15.Uncaught Error calling method on NPPobject at JsRuntime:1
    16.api.accessNative传递参数给原生
    17.dot.js如何传递对象
    18.如何获取设备是IOS还是安卓,以及设备型号
    19.从竖直的主Activity启动横屏的H5导致APP直接退出
    20.APPLoader 加载JS在小米会报xx is not defined 华为和模拟器正常
    21.从H5竖屏页面转H5横屏页面,出现崩溃信息
    22.api is not defined
    23.APICloud Webstorm WiFi日志输出报错:java.io.IOException: Couldn't create PTY
    24.Webstorm HTML文件无法拖拽到Webstorm里面打开
    25.overflow-y: scroll ios 滑动不流畅

    1、今天遇到了一个顶部跟状态栏重合的状况

    TTKL7KT@_%%QG$KWEM11ZUB.png
    我的解决方案是关闭<preference name="statusBarAppearance" value="false"/> 关闭它,statusBarAppearance 跟 iOS7StatusBarAppearance是一样的知识iOS7StatusBarAppearance只是针对ios
    或者你一样开启<preference name="statusBarAppearance" value="true"/>,然后调用$api.fixStatusBar来解决
    官网API如下:
    http://docs.apicloud.com/Front-end-Framework/framework-dev-guide#45
    2、今天遇到一个问题,我一个Project目录下有很多module,就是我跑A Modle,它总是把B Modle跑起来,后来解决方案是:因为2个项目的config.xml 里面的widget id相同导致的问题 L(`CDFTCU3{RNEHUSHMH9M1.png

    3、今天遇到一个问题,在首页里面我们含有下拉刷新的控件的,但是IOS切换页面后,再切换回来,就不能下拉刷新了,后来改了api.openFrame bounces为true属性,就可以使用了

    4、今天写模块的开发,突然看到一个叫moduleDemo里面的我就想了一个问题
    UZResourcesIDFinder.getResIdID("text");这个方法是获取mo_demo_main_activity里面的一个TextView的Id,如果我自定义另外一个layout,
    比如名字叫mo_demo_main_hello的layout,当然我不通过UZResourcesIDFinder.getResLayoutID去加载它的mo_demo_main_hello的layout,(mo_demo_main_hello)的layout里面也有一个叫text的TextView,
    那么问题来了,我通过UZResourcesIDFinder.getResIdID("text")这个查找到的TextView是哪个里面的?最后根据我的实验,它是找的mo_demo_main_activity里面的TextView,因为我是通过UZResourcesIDFinder.getResLayoutID 去加载mo_demo_main_activity

    17.png

    5、superwebView 如何加载外部网址
    在APP调用浏览器有两种方法:
    1.使用openApp
    2.使用openWin/openFrame

    两种方法调用浏览器后的效果有一点不同:
    1.使用openApp调用浏览器后,如果手机内有多个浏览器,会首先弹出选择浏览器的框
    2.使用openWin/openFrame,直接打开网页.
    openWin:

       api.openWin({
                name : 'win_show2',
                url : 'http://www.baidu.com',
                rect: {
                   x: 0,
                   y: 0,
                   w: ‘auto’,
                   h: 'auto'
                    }
                })
    

    openFrame:

    在apiready里面加入
    api.openFrame({
        name: 'biadu',
        url: 'http://www.baidu.com',
        rect: {
            x: 0,
            y: 0,
            w: ‘auto’,
            h: 'auto'
        },
        bounces: true,
        bgColor: 'rgba(0,0,0,0)',
        vScrollBarEnabled: true,
        hScrollBarEnabled: true
    });
    

    openApp:

         api.openApp({
            androidPkg : 'android.intent.action.VIEW',
            mimeType : 'text/html',
            uri : 'http://www.baidu.com'
             }, function(ret, err) {     
             });
    

    必须要加入 http或者https 这样的,否则无法加载

    1. 使用execScript(回调) 传递参数
    api.execScript({
            name:'root', //这里root代表index.html
            frameName: 'frame_index_me',
            script: 'setData("' + id + '","' + name + '");'
    });
     function setData(id, name){
         alert("这是我的id: " + id);
         alert("这是我的name: " + name);
    }
    

    上面这段代码是从superwebView论坛里面找到的。
    下面是我自己发现的一个

    api.execScript({
            name:'root', //这里root代表index.html
            frameName: 'frame_index_me',
            script: 'setData();'
    });
     function setData(id, name){
         alert("这是我的id: " + id);
         alert("这是我的name: " + name);
    }
    

    我就这样执行操作,它也是能够执行成功的

    1. html页面之间传递参数
     api.openFrame({
            name: 'deliverOrder_list',
            url: '../html/deliverOrder_list.html',
            bounces: false,
            rect: {
                x: 0,
                y: headerHeight,
                w: 'auto',
                h: heightForFrame
            },
            pageParam: {  //这个是用来传递参数的
                coPickNo: coPickNo
            }
        });
    

    获取参数deliverOrder_list.html页面

     if (api.pageParam != null && api.pageParam != '') {
            if (api.pageParam.coPickNo != null && api.pageParam.coPickNo != '') {
                coPickNo = api.pageParam.coPickNo;
            }
        }
    
    1. div或者其它标签里面,自定义参数字段,然后获取
      自定义参数字段
      {{for(var prop in it) { }}
        <li paramValue="{{=it[prop].erpPtId}}">{{=it[prop].displayText}}</li>
        {{}}}
    //paramValue是我自定义的
    

    获取自定义参数

    var  erpPtId = $api.attr(this, 'paramValue');
    //this,表示此时被点击的对象,在被点击的对象里面找paramValue
    

    9.使用api.download下载文件

     api.download({
            url: 'xxxx',
            savePath: 'fs://aaaaaaaaaaa.jpg',
            report: false,
            allowResume: false
        }, function (ret, err) {
            if(ret.state==1){
                alert('下载成功');
            }
        });
    

    url:你要下载的地址,不管你下载的文件后缀是.jpg,还是.png,还是.xml,还在.zip格式的,你都需要在savePath:'fs://xxxxxxxx.你要下载的格式',写上你对应的格式

    10.使用函数function函数回调(callBack)传递参数

    ajaxRequest(getTabBarBannerUrl + JSON.stringify(urlParam), 'GET', '', function (ret, err) {
            if (ret) {
                var content = $api.byId('banner-content');
                var tpl = $api.byId('banner-template').text;
                var tempFn = doT.template(tpl);
                content.innerHTML = tempFn(ret[0].banner);
                initSlide();
            } else {
                api.toast({msg: err.msg, location: 'middle'})
            }
        })
    

    ajaxRequest函数:

    function ajaxRequest(url, method, bodyParam, callBack) {
        var common_url = 'https://d.apicloud.com/mcm/api';
        var appId = 'A6963429484030';
        var key = '7F836F04-CAAC-52C8-2332-CF337134FA6F';
        var now = Date.now();
        var appKey = SHA1(appId + "UZ" + key + "UZ" + now) + "." + now;
        api.ajax({
            url: common_url + url,
            method: method,
            cache: false,
            timeout: 20,
            headers: {
                "Content-type": "application/json;charset=UTF-8",
                "X-APICloud-AppId": appId,
                "X-APICloud-AppKey": appKey
            },
            data: {
                body: bodyParam
            }
        }, function (ret, err) {
            callBack(ret, err); //这行是回调的
        });
    }
    

    11.从Activity打开widget文件夹下面某一个Html页面

        Intent intent = new Intent(this, WebPageModule.class);
                //不传递startUrl的情况下,默认走自动加载widget的机制,即:APICloud引擎会自动去解析assets/widget目录下的资源并加载
    //          String url = "file://" + UZUtility.getExternaStoragePath() + "index.html"; 
    //          intent.putExtra("startUrl", "file:///android_asset/widget/index.html");
    //          intent.putExtra("startUrl", url);
                startActivity(intent);
    

    12.从Activity里面无法找到widget文件夹下面的某一个Html页面

     Intent intent = new Intent(this, ContractExecuteHtmlActivity.class);
                        String url = "file:///android_asset/widget/html/purchase.html";
                        intent.putExtra("startUrl",url);
                        startActivity(intent);
    

    我使用这样的方式一直找不到html页面,后来发现,是html页面根本没有编译到apk里面

    13.使用addEventListener传递参数

    //发送广播事件
    api.sendEvent({
        name: 'myEvent',  //要和接收广播参数的对应
        extra: {
            name: '张三',
            age: '18'
        }
    });
    
    //接收广播事件参数
    //html页面a:
    api.addEventListener({
        name: 'myEvent'
    }, function(ret, err) {
        alert(ret.value.name);//打印名字
        alert(ret.value.age);//打印年龄
    });
    

    14.同一个功能里面含有2个相同的Frame页面,我是否可以共用同一个Frame页面
    我告诉你答案是可以的,不过 name要不相同

    //打开frame组页面页面
        api.openFrameGroup({
            name: 'inveneryQueryGroup',
            scrollEnabled: true,
            rect: {
                x: 0,
                y: titleHeaderHeight+nvarHeader,
                w: 'auto',
                h: showHeaderHeight-nvarHeader-footerHeight
            },
            index: 0,//默认显示的默认索引
            frames: [{
                name: 'inventeryQuery_depot_frame_list',           //按仓库
                url: '../html/inventeryQuery_depotVariety_frame_list.html',
                bounces: false,
                vScrollBarEnabled: false,
                hScrollBarEnabled: false,
                pageParam: {
                    erpPtId: erpPtId,
                    status:INVENTERYQUERY_10
                }
            }, {
                name: 'inventeryQuery_Variety_frame_list',          //按品种
                url: '../html/inventeryQuery_depotVariety_frame_list.html',
                bounces: false,
                vScrollBarEnabled: false,
                hScrollBarEnabled: false,
                pageParam: {
                    erpPtId: erpPtId,
                    status:INVENTERYQUERY_20
                }
            }]
        }, function (ret, err) {
            var index = (ret.index);//下标
            var navBarBar = $api.dom('#navBar_receipt_dailyPay .navBar_bar_inner');
            navBarBar.style.webkitTransform = 'translateX(' + index * 100 + '%)';//设置下标蓝色滑动
        });
    

    15.Uncaught Error calling method on NPPobject at JsRuntime:1
    我出现这个问题是我Html页面下载了文档, 然后想通过调用原生的方式去打开,结果发现,原生报错了所以解觉原生错误的代码即可

    1. api.accessNative传递参数给原生
    api.accessNative({
        name: 'showMenu',
        extra: {
            filePath: 'xxx/xxxx/abc.xml'
        }
    }, function(ret, err) {
    });
    

    原生界面获取extra对象

     JSONObject jsonObject =  moduleContext.optJSONObject("extra");
                Log.i(TAG,jsonObject.optString("filePath"));//xxx/xxxx/abc.xml
           //moduleContext是UZModuleContext
    

    17.dot.js如何传递对象

    <script type="text/template" id="fujian_ul_template">
        {{for(var prop in it) { }}
        <li fileIdValue="{{=it[prop].fileId}}" ptIdValue="{{=it[prop].ptId}}" paramsValue='{{!JSON.stringify(it)}}' onclick="fnDownFile(this)">
            <p class="fileName">
                <a>
                {{? it[prop].fileName}}
                  {{=it[prop].fileName}}
                {{}}}
                </a>
            </p>
        </li>
        {{}}}
    </script>
    

    注意上面我的{{!JSON.stringify(it)}},这里是将json对象转为字符串

     var attachments = JSON.parse($api.attr(e, 'paramsValue'));
            console.log("对象"+JSON.stringify(attachments[0]));
            console.log("对象"+JSON.stringify(attachments));
    
    dot.js传递对象.png

    18.如何获取设备是IOS还是安卓,以及设备型号

      if(api.systemType=='ios'&&api.deviceModel=='iPhone X'){//如果是苹果X
            $api.fixStatusBar(header);//解决IOSX
        }
    var systemType = api.systemType;  // 比如: ios
    var deviceModel = api.deviceModel;  // 比如: iPhone 5
    

    19.从竖直的主Activity启动横屏的H5导致APP直接退出
    我最近有个需求,我需要从主Activty启动一个横屏的H5,我进入横屏的H5页面后,再点击返回按钮返回主Activity,发现直接退出APP了,没有任何的异常信息错误提示。
    解决办法:
    AndroidManifest.xml

    <!--主Activity-->
     <activity
                android:name="xxxxxxxxxxx.activity.MainActivity"
                android:label="@string/title_activity_main"
                android:logo="@drawable/icon_application"
                android:screenOrientation="portrait"
                android:configChanges="orientation|screenSize|keyboardHidden"
                android:theme="@style/Baf.Theme.NoTitleBar"
                android:windowSoftInputMode="adjustPan"/>
    <!--横屏的H5,因为HTML是承载在activity上面的-->
            <activity android:name=".business.activity.VisualizationHtmlActivity"
                android:screenOrientation="landscape"
                android:theme="@style/H5StyleNotitle"/>
    

    ****** 注意:我这里的MainActivity是主页面的(它承载了4个Fragment),然后我启动的VisualizationHtmlActivity呢,是我在fragment点击后需要进入的
    主Activity页面加入
    android:configChanges="orientation|screenSize|keyboardHidden"
    这样就可以防止app走生命周期的销毁流程,如果你要在切换横竖屏幕的时候做一些操作可以加入一些监听

     @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            int mCurrentOrientation = getResources().getConfiguration().orientation;
            if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ) {
                BAFLogger.i(TAG,"PORTRAIT");
            } else if ( mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ) {
                BAFLogger.i(TAG,"LANDSCAPE");
            }
        }
    
    

    总结:哪个页面需要转换屏幕就在哪个页面上添加。
    文献参考
    http://blog.sina.com.cn/s/blog_77c632410101790w.html (讲解横竖生命周期)
    https://blog.csdn.net/michelle0516/article/details/37876325 (讲解关/熄屏幕会多次走生命周期)

    20.APPLoader 加载JS在小米会报xx is not defined 华为和模拟器正常
    这个问题很蛋疼,最开始在官方里面的论坛里面问,他们还是没有给出正解的答案。后面自己乱弄就好了
    首先打开手机SD卡,把UZMap删除,然后用自带的清理工具,清理垃圾,然后重新启动手机,搞定。

    21.从H5竖屏页面转H5横屏页面,出现崩溃信息
    错误信息如下

    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at com.uzmap.pkg.uzcore.UZCoreUtil.hideSoftKeyboard(UZCoreUtil.java:280)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at com.uzmap.pkg.uzcore.t.onVisibilityChanged(UZHybridWindow.java:128)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at android.view.View.dispatchVisibilityChanged(View.java:8778)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at android.view.ViewGroup.dispatchVisibilityChanged(ViewGroup.java:1278)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at android.view.View.setFlags(View.java:9870)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at android.view.View.setVisibility(View.java:6742)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at com.uzmap.pkg.uzcore.t.f(UZHybridWindow.java:1177)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at com.uzmap.pkg.uzcore.p.a(UZHybridWidget.java:521)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at com.uzmap.pkg.uzcore.p.a(UZHybridWidget.java:491)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at com.uzmap.pkg.uzcore.p$2.run(UZHybridWidget.java:324)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at android.os.Handler.handleCallback(Handler.java:815)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:104)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at android.os.Looper.loop(Looper.java:194)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5562)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:968)
    05-16 22:07:42.926 10028-10028/com.gise_gnm.mobile.gkapp W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:763)
    05-16 22:07:42.956 10028-10028/com.gise_gnm.mobile.gkapp W/WebView: setLayerType()
    
    05-16 17:16:22.274 10247-10247/com.gise_gnm.mobile.gkapp W/WebView: setLayerType()
    05-16 17:16:22.305 10247-10247/com.gise_gnm.mobile.gkapp W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 10247
    05-16 17:16:22.614 10247-10247/com.gise_gnm.mobile.gkapp W/cr_AwContents: Application attempted to call on a destroyed WebView
     java.lang.Throwable
    at org.chromium.android_webview.AwContents.isDestroyed(AwContents.java:1256)
    at org.chromium.android_webview.AwContents.isDestroyedOrNoOperation(AwContents.java:1186)
    at org.chromium.android_webview.AwContents.getTitle(AwContents.java:2044)
    at org.chromium.android_webview.AwWebContentsDelegateAdapter.loadingStateChanged(AwWebContentsDelegateAdapter.java:280)
    at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
    at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:41)
    at android.os.Handler.dispatchMessage(Handler.java:111)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5562)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:968)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:763)
    05-16 17:16:22.695 10247-10247/com.gise_gnm.mobile.gkapp W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 10247
    05-16 17:16:22.696 10247-10247/com.gise_gnm.mobile.gkapp W/cr_AwContents: Application attempted to call on a destroyed WebView
    java.lang.Throwable
    at org.chromium.android_webview.AwContents.isDestroyed(AwContents.java:1256)
    at org.chromium.android_webview.AwContents.isDestroyedOrNoOperation(AwContents.java:1186)
    at org.chromium.android_webview.AwContents.getTitle(AwContents.java:2044)
    at org.chromium.android_webview.AwWebContentsDelegateAdapter.loadingStateChanged(AwWebContentsDelegateAdapter.java:280)
    at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
    at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:41)
    at android.os.Handler.dispatchMessage(Handler.java:111)
    at android.app.ActivityThread.main(ActivityThread.java:5562)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:968)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:763)
    

    解决办法:
    解决办法其实跟20的一样,哪个页面需要转换屏幕就在哪个页面上添加。

    22.api is not defined
    说明:我这个HTML页面加载了jquery.js进去了的
    我错误的源码

    $(function () {
        if (api.pageParam && api.pageParam != '') {
            if (api.pageParam.item && api.pageParam.item != '') {
                item = api.pageParam.item;
            } else {
                alert("传递的item参数为空");
                closeFrame();
                return;
            }
        } else {
            alert("传递的item参数为空");
            closeFrame();
            return;
        }
      。。。。省略代码
    });
    

    如果我像上面这样写会报这个错误:api is not defined
    正确的写法

    //$(function () {
    apiready = function () {
        if (api.pageParam && api.pageParam != '') {
            if (api.pageParam.item && api.pageParam.item != '') {
                item = api.pageParam.item;
            } else {
                alert("传递的item参数为空");
                closeFrame();
                return;
            }
        } else {
            alert("传递的item参数为空");
            closeFrame();
            return;
        }
          。。。。省略代码
    }
    //});
    

    23.APICloud Webstorm WiFi日志输出报错:java.io.IOException: Couldn't create PTY
    文章转载:
    https://blog.csdn.net/DeMonliuhui/article/details/79777389
    解决方案:
    将cmd路径写完整
    "C:\Windows\System32\cmd.exe" /K "chcp 936 && java -jar C:/APICloud/workspace/wifilog.jar C:/APICloud/workspace/log_info"

    24.Webstorm HTML文件无法拖拽到Webstorm里面打开
    文章转载:http://www.jackxiang.com/post/8725/
    运行中输入regedit,打开注册表编辑器
    在下面的键值:
    HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > Windows > CurrentVersion > Policies > System
    找到EnableLUA将1改成0,然后重启机子。

    25.overflow-y: scroll ios 滑动不流畅
    文章转载:https://blog.csdn.net/dnpao/article/details/76571474
    加入如下规则

    .bigItem-list {
        width: 100%;
        -webkit-overflow-y: scroll;
        overflow-y: scroll;
        -webkit-overflow-scrolling: touch; /**解决IOS滑动不流畅问题**/
    }
    

    相关文章

      网友评论

        本文标题:SuperWebView 记录我遇到的问题解决方案

        本文链接:https://www.haomeiwen.com/subject/qustpxtx.html