美文网首页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