1. 引言

之前我们讲过一个helloworld.lzx的简单应用,来了解创建lzx程序的一些基本使用,在此基础上,需要对lzx来进行进一步的了解,下面我们会通过创建一个news.lzx来加深对 lzx的了解,主要是模拟新闻信息的显示和阅读。

2. 需求分析

2.1 在news.lzx这个应用中,主要在应用中创建一个本地数据集来保存我们所要显示的信息,本地数据集需要在canvas中声明,通过<dataset>标签来进行定义。如:我们在该应用中创建的数据集。
<canvas width="240" height="320">
<dataset name="myData">
   <news>
    <item>
        <title>胡锦涛在中央党校发表重要讲话</title>
        <content>中共中央总书记、国家主席、中央军委主席胡锦涛25日在中央党校省部级干部进修班发表重要讲话。
        </content>
    </item>
    <item>
        <title>公安部通缉黑砖窑案疑犯</title>
        <content>记者25日从公安部了解到,公安部近日对山西黑砖窑案中的8名在逃犯罪嫌疑人分别发出B级通缉令。
      通缉令说,2007年3月份以来,山西省连续发生多起黑砖窑主非法限制民工人身自由、非法雇用童工、强迫民工超强度劳动、殴打民工致死、致残案件,在社会上引起恶劣影响。
        </content>
    </item>
    <item>
        <title>福建集中销毁六亿毒品</title>
        <content>25日上午,福建省禁毒办在闽侯青口专业焚烧场所销毁4余吨各类毒品,它们是全省警方从2004年至今在打击毒品犯罪中缴获的。据介绍,这4吨毒品价值在6亿元人民币以上。 
        25日上午6时许,福建省禁毒办门口。 
        两辆军用卡车停靠在路边,两边各站一名手持抢支的武警战士。武警二支队的武警战士紧张地从仓库搬运130多编织袋及七八个大号塑料桶,里面所装的全部都是毒品...。 
        </content>
    </item>
  </news>
</dataset>
</canvas>
定义了一个myData数据集,里面包含了<news>根接点,<news>下面存在3条记录信息,每条信息里面分别有<title>和<content>两个结点,分别表示新闻的名称和内容。
2.2 显示的数据已经存在,接下来需要考虑在页面上如何显示这个信息,也就是页面的排版,在运行应用以后,首先显示的所有新闻的名称,并且焦点在第一条记录的位置上,可以按上下键进行选择记录,并按F3键或手机左功能键打开新闻,进行阅读。读完以后返回到界面。这样我们就需要把应用分成两个主界面,
﹡一个显示所有的新闻名称的界面。
﹡另一个显示内容的界面。

3. 编码详细讲解。

功能在上面我们已经基本上进行分析了,下面来讲一下具体的代码编写:
3.1 创建界面。
根据上面的分析,需要两个主要界面,还有一个背景界面的显示,主要用来显示一些公共的信息如背景图片和左右按钮,具体代码如下:
<view id="bg"  height="320" resource="images/rmw-background.gif" >
    <text id="lb" x="30" y="295" fontsize="18"  text="选择"/>
    <text id="rb" x="170" y="295" fontsize="18" text=""/>
</view>
显示所有的新闻名称的界面的创建:

 
<view y="60" id="vNews" visible="false">
   <attribute name="findex" type="number" value="0" />
   <view x="2" y="0" resource="images/rmw-button-a.gif" />
   <drawview id="drawbg" y="0">
       <method name="drawrect" ><![CDATA[
           this.clear();
           this.rect(3,30,235,30);
           this.strokeStyle=0xCA0002;
           this.stroke();  
       ]]></method>
  </drawview>
   <view fontsize="16" y="35" id="contID">
       <simplelayout axis="y" spacing="20" />
       <view datapath="myData:/news/item" fgcolor="#004276">
           <view x="7" y="8" resource="images/rmw-ico-6.gif" />
           <text x="12" datapath="title/text()" name="t1"/>
       </view>
   </view>
</view>
在这段代码中,新闻名称显示主要通过id为contID的视图来进行显示,显示时是通过数据绑定的方式来进行显示,t1显示的是具体的内容。移动焦点是通过drawview来画的,vNews视图默认设置成visible="false",还定义了一个自定义属性findex,类型为number型,默认值为0,用来控制当前显示的为第几条记录。
显示内容的界面:

<view y="60" visible="false" width="240"  id="vread" >
    <simplelayout axis="y" spacing="5" />
    <text x="5"  fontsize="16"   fgcolor="#004276" name="t1"/>
    <text x="5" fontsize="16"  fgcolor="#004276" width="230" multiline="true"  name="t2"/>
</view>
注意在这段代码中,由于内容比较多,所以在显示的时候,t2设置成multiline="true"自动换行方式,vread视图默认设置成visible="false"。
声明数据指针:
<datapointer id="dp" xpath=""/>
3.2 事件执行
在该应用中,当初始化所有代码以后,需要执行oninit事件,如:
<handler name="oninit">   
   vNews.setVisible(true);
   drawbg.drawrect();
</handler>
Oninit事件以后,首先需要把vNews视图设置成可见,并绘制焦点条。
   
   当我们触发键盘时,会触发相应的键盘事件,
   <method name="move" args="index">
   if(vNews.getVisible() == true){
        vNews.findex = vNews.findex + index;
        if(vNews.findex < 0){
            vNews.findex = contID.subviews.length-1;
        }else if(vNews.findex == contID.subviews.length){
            vNews.findex = 0;
        }

       drawbg.setY(vNews.findex*40);
   }
</method>
<handler name="onkeydown"  args="key" reference="LzKeys">
<![CDATA[
    switch(key){
        case 38:  //up
            this.move(-1);
            break;
        case 40:  //down
            this.move(1);
            break;
        case 33:
        case 4108: 
            if(vNews.getVisible()){
               vNews.setVisible(false);
               vread.setVisible(true);
               var str = "myData:/news/item["+(vNews.findex+1)+"]/content";
               dp.setXPath(str);
               vread.t2.setText(dp.getNodeText());
               dp.selectPrev();
               vread.t1.setText(dp.getNodeText());
               lb.setText(" ");
               rb.setText("返回");
            }
            break;      
        case 34:
        case 4109:   //right button
           if(vNews.getVisible()==false){
              vNews.setVisible(true);
              vread.setVisible(false);
              lb.setText("选择");
              rb.setText(" ");
           }
            break;    
    }
    ]]>
    </handler>
当按上下键时,会调用canvas下面的move()函数,在move()函数中首先判断当前显示的视图是不是vNews,如果时,对焦点进行移动操作,如过不是,则不进行处理。按F3或手机上左功能键时,如果当前视图是vNews,则关闭vNews视图,显示vread视图,通过datapointer指针读出当前数据集中记录的内容和名称,并把内容和名称设置到vread下t1和t2的text结点进行显示。如果当前视图不是vNews,按F4键或手机的右功能键返回到首界面也就是显示vNews视图。