OpenFace 开发常见问题

出自OpenFace

跳转到: 导航, 搜索

注: 本开发常见问题适用于最新版本

1.开发环境问题

1)问:下载了SDK,但是无法正确运行Tomcat服务。

答:首先检查是否正确按照了JDK,并正确配置系统环境变量(详细请参见使用文档)。其次检查Tomcat服务所用的端口(默认是8080)是否已经被占用(即开发主机上有其他应用使用该端口,比如另外一个tomcat服务器)。正确启动tomcat后载浏览器窗口输入http://localhost:8080 应该能看见tomcat欢迎页面。 注:文档中假定您在本机开发,并且使用SDK自带的tomcat。


2)问:模拟器为什么不能显示我要编译的应用?

答:首先确保tomcat正常启动(见上)。其次保证你应用文件夹在mobileSDK(前面MobileSDK_HOME环境变量指定的文件夹)文件夹下的OpenLaszlo\WebRoot下。并且按照规定修改了模拟器的openface.ini文件,将其中需要编译的文件路径修改为相应的文件(是相对路径,例如:如果是/webroot/game/index.lzx, 您则需要修改compile-file = HelloWorld/index.lzx 为compile-file = game/index.lzx) 如果以上正确但问题还存在,请检查是否正确设置了JAVA_HOME和MobileSDK_HOME的系统环境变量(为了避免在手工输入时键入不必要的空格导致参数错误,请使用复制的方式录入。

3)问:我的tomcat正常启动,但是模拟器不能正常的启动。

答:请安装一个补丁程序,位于emulator_patch\vcredist_x86.exe,安装后就可以解决相应的问题。如果能

4)运行模拟器黑屏或死机

答:首先请检查OpenFace.ini是否存在。其次检查模拟器exe文件所在目录下的\root\desktop 子目录中是否目标代码。目标代码至少包含desc.xml,xml文件说明了应用首要目标代码文件,相关联文件必须存在。

5)编译后的目标代码在哪里?

答:和1.0版本不同的是,1.1中编译后的目标代码不再在模拟器的desktop目录下,而是在源代码的bin目录下,同时打包后的dat文件也在该目录下,当在模拟器上点编译时,编译生成的目标代码将会产生在源代码所在目录下的/bin文件夹中,然后模拟器在下载应用之后(编译后会自动下载),相应的文件也将会产生到模拟器的application目录下,而desktop目录将会继续保持为在desktop文件夹下的应用。

6)问:我的问题不在以上问题中

答:观察Compile的输出窗口,看是否能提供解决问题的提示信息。如果还不能解决,请在OpenFace论坛中请求帮助或者联系易路联动技术支持(techsupport@eloomobile.com)。


2.开发问题

1)问:为什么我的应用上使用鼠标没有反应?

答:OpenFace的目标环境是手机系统,因此目前没有提供鼠标支持,但是考虑越来越多的手机支持触摸屏,以后OpenFace将会提供鼠标支持。

2)问:为什么按键盘的方向键,我应用中的焦点无法移动

答:应用的焦点可以分两种:1、对于能得到焦点的元素得到焦点时,系统自动画上焦点边框2、开发人员自行画的焦点边框或者焦点背景。对于第一种,必须使用LzFocus.setFocus(element)才能让焦点落到element所引用的元素上。对于第二种完全由开发人员画出焦点框或者使用图片背景之类。

3)问:为什么使用LzFocus.setFocus(elementobj)方法没有作用

答:首先要保证该方法确实被调用。其次elementobj对应的元素必须是能得到焦点的(常见默认能得到焦点的元素有inputtext,如果是view则需要在属性中加上focusable=’true’)。最后确定参数elementobj在js中是一个lzx元素对象的引用。通过

canvas.elementname.subelename…方式可以逐级引用到canvas各个设置了name属性的元素。也可以使用id方式直接引用,比如:


<?xml version="1.0" encoding="utf-8"?>
<canvas width="240" height="320">
  <view name="v1">
       <inputtext name="input1" id="myinput" width="100"/>
   </view>
   <handler name="oninit">
       LzFocus.setFocus(canvas.v1.input1);     //正确,通过name方式引用
       LzFocus.setFocus(this.v1.input1);        //正确,和上面等价,这里this等价canvas
       LzFocus.setFocus(myinput);              //正确,通过id方式引用
       LzFocus.setFocus("canvas.v1.input1");    //错误,参数不应为string
       LzFocus.setFocus("myinput");            //错误,参数不应为string
   </handler>
</canvas>

注意:直接从本文档中copy源代码示例后如果不能正常编译或者应用不能正常打开,请先检查copy出来的xml代码是否存在中文标点问题(word转换问题),可以直接在IE中看该XML文件,如果IE能正确显示则说明无问题。

4)问:使用中文后,应用编译后不能运行或者显示乱码

答:OpenFace暂时只支持utf-8编码,所以当您的应用中使用中文字符时,首先应该设置xml文件xml元素标记的encoding=”utf-8”(此步不正确设置应用可能无法运行),并且将该文件保存成utf-8格式(在中文xp系统中默认保存是ACSII格式,此步不正确设置会导致中文乱码),如果应用中有多个文件使用中文,则每个含中文的文件都应该保存成utf-8格式。

5)问:使用ajax或者dataset请求时,如果参数有中文,为什么在服务器端接受到的是乱码。

答:服务器端处理参数时请使用

new String(request.getParameter(name).getBytes("ISO8859_1"),"utf-8")

6)问:应用如何响应用户的操作?

答:目前OpenFace只接受用户键盘(PC或手机)的响应。在应用中有两种方式处理按键:1、得到焦点的元素处理按键2、无论是否得到焦点的元素都处理按键。前者只有当该元素得到焦点的情况下用户的按键才被捕捉,而后者无论什么情况下都能捕捉用户的按键。因此应用可以有多处处理用户按键的代码。元素需要处理按键时为该元素添加一个onkeydown的handler即可,如下:

方式1和方式2的区别在于handler中是否设置reference属性,如果不设置则为方式1,否则为方式2。

<handler name="onkeydown" args="key" reference="LzKeys">
       var keycode=key.intValue();          
       switch(keycode){
           case LzKeys.VK_LEFT:
           
               //左方向键
               break;
           case LzKeys.VK_RIGHT:
               //右方向键
               break;            
           case LzKeys.VK_UP:
               //上方向键
               break;
           
           case LzKeys.VK_DOWN:
               //下方向键
               break;
           default:
               Debug.write("keycode="+keycode);          }
</handler>

具体按键值请见OpenFace 编程参考手册

7)问:通过js或者java给view设置resource,但是图片不能显示

答:在js或者java中设置resource时,图片资源文件不能被编译工具编译到目标文件夹。有两种方式解决:1、手工copy图片文件至目标文件夹。2、在lzx中添加一个Resource,例如:

<resource name="ren" src="yddt-ren.gif"/>

如果出现其他的一些图片不能显示的问题,请先检查编译工具是否将图片文件编译到目标文件夹。

8)问:我应用中有两个view,但只能看到一个。

答:在OpenFace中,如果不设置元素的x、y值,也没有设置layout,那么默认元素的x和y值均为0,这样两个元素最终显示是重叠在一起使得可能只显示一个,这个同html中元素的显示是有区别的。


9)问:关于获得焦点的问题。

答:View 需要设置一个属性 focusable=”true” 才可以获得焦点. 如: <view focusable=”true”/>