0
点赞
收藏
分享

微信扫一扫

将自定义 widget 嵌入 Kuix 界面

_铁马冰河_ 2022-10-21 阅读 183

将自定义 widget 嵌入 Kuix 界面

        在上一篇博客《​​在 Kuix 框架下绘制自己定义的画布​​​》中,我们谈论了如何在以低级界面实现的 Kuix 框架下绘制自定义画布,以及自定义画布用户事件的加入的问题。我们已经可以使用 Kuix 按照我们的意图来运行自定义的低级界面了。然而关于自定义画布的调用,采用的是显式地 new 的方法:
Screen screen = new Screen(); PmapWidget map = new ChildPmapWidget("Child of widget"); screen.add(map); screen.setCurrent();
        这样做不足之处有二:其一,我们自定义的 widget 没有返回按钮,没有标题。也就是说,我们的 widget 全屏显示了,而且没有任何按钮来让用户返回上一步操作,而且也没有标题通知用户当前操作所处的位置;其二,Kuix 所有的界面可以使用 Screen 从 xml 配置文件中读取,也就是说我们看到的任何组件,都可以在 xml 文件中进行配置。显式地 new 出 widget,显然与 Kuix 的框架思路背道而驰。
        如何将自定义 widget 在 kuix 的 xml 文件中进行配置?如何调用我们自定义的 widget?如何将自定义 widget 嵌入 Kuix 界面,和其他 Kuix 组件(比如按钮等)一起显示?我们就在这篇博客中详细地讨论解决这些问题的步骤。
        仍然采用我们在上一篇博客中写的自定义的 widget 的例子,PmapWidget.java 的源代码不变。但是其子类 ChildPmapWidget.java 的源码略有改动。改动后的源代码如下:

/**
* 文件名:ChildPmapWidget.java
*
* 版本信息:
* 日期:2009-12-19
* Copyright XXX Corporation 2009
* 版权所有
*
*/
package com.xxx.kuix.widget;
/**
*
* 项目名称:Canvasdemo4-position-map
* 类名称:ChildPmapWidget
* 类描述:PmapWidget 的孩子类。目前还没有任何自己的功能实现
* 创建人:Defonds
* 创建时间:2009-12-19 上午10:54:07
* 修改人:Defonds
* 修改时间:2009-12-19 上午10:54:07
* 修改备注:
* @version
*
*/
public class ChildPmapWidget extends PmapWidget {

/**
* ChildPmapWidget 的标签
*/
public static final String CHILD_PMAP_WIDGET_TAG = "childpmapwidget";
/**
* 创建一个新的实例 ChildPmapWidget.
*/
public ChildPmapWidget() {
super(CHILD_PMAP_WIDGET_TAG);
}
}


        定义一个 Frame,MovMapFrame 来负责显示我们自定义的 widget:

/**
* 文件名:MovMapFrame.java
*
* 版本信息:
* 日期:2009-12-21
* Copyright XXX Corporation 2009
* 版权所有
*
*/
package com.xxx.kuix.frame;
import org.kalmeo.kuix.core.Kuix;
import org.kalmeo.util.frame.Frame;
/**
*
* 项目名称:Canvasdemo12-bus
* 类名称:MovMapFrame
* 类描述:显示我们自定义的 widget
* 创建人:Defonds
* 创建时间:2009-12-21 下午04:44:11
* 修改人:Defonds
* 修改时间:2009-12-21 下午04:44:11
* 修改备注:
* @version
*
*/
public class MovMapFrame implements Frame {
/**
* 需要加载的界面
*/
public void onAdded() {
Kuix.loadScreen("/xml/CustomMap.xml", null).setCurrent();
}
/**
* 处理用户信息事件
*/
public boolean onMessage(Object identifier, Object[] arguments) {

/**
* 返回主界面
*/
if ("back".equals(identifier)){
Kuix.getFrameHandler().removeFrame(this);
Kuix.getFrameHandler().getTopFrame().onAdded();
return false;
}
return false;
}
public void onRemoved() {}
}


        在项目的 res 下的 xml 文件夹中 加入 CustomMap.xml,其源代码如下:

<screen title="自定义的 widget" cleanUpWhenRemoved="true" >
<childpmapwidget/>
<screenFirstMenu onAction="back">上一步</screenFirstMenu>
</screen>
然后在我们的 KuixMIDlet 程序中将其父类 org.kalmeo.kuix.core.KuixMIDlet 的 createNewConverterInstance 方法重写:
/**
* 注册自定义 Widget
*/
protected KuixConverter createNewConverterInstance(){
return new KuixConverter(){
public Widget convertWidgetTag(String tag){

/**
* 注册 com.XXX.kuix.widget.ChildPmapWidget
*/
if(ChildPmapWidget.CHILD_PMAP_WIDGET_TAG.equals(tag)){
return new ChildPmapWidget();
}

return super.convertWidgetTag(tag);
}
};
}


        运行程序,效果图如下:


        进入这个界面后,我们按下向上键,或者长按向左键,泡泡已经可以运动了;而当我们按下“上一步”按钮后,也可以返回上一个 Frame 了。



举报

相关推荐

0 条评论