锁定老帖子 主题:Kuix 教程8 中文的自动断行2
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-11
原本以为关于TextArea的断行问题已经写得足够多了,而且给出一个大致的解决思路,但是昨天实机测试的是否发现还是有不少问题的,看似一个简单的问题,其实和Kuix的布局机制紧密关联,而布局,看起来是无关紧要,很多简单的应用可能根本用不上,但是应该说是整个Kuix的一个基础基石,所以这里分析一下Kuix的一些基础代码,顺便给出一个进一步的解决方式. layout有很多种,如果一个widget(泛指基础于widget的所有控件)没有指定布局实际上默认是Inlinelayout,一个子对象占用一行,而不是我原先设想的flowlayout,但是在解析TextArea分词函数的时候,我们看到实际上是把每个word拆分为Text加入内容,所以实际上Textarea就是一个容器,这个也是论坛上某人解释说TextArea和TextField的实现方式不同的原因,它无法做到实时编辑,或者说作者觉得没有必要费劲去实现.实际上TextArea就是flowlayout
private static final Layout TEXTAREA_DEFAULT_LAYOUT = new FlowLayout(Alignment.BOTTOM);作者采用这个做法其实我费了很大的劲才满满理解,因为windows的编程思路是每个控件都有位置大小的,再根据大小选择需要显示的内容(视口),而java的布局思想更倾向于一种堆积木的方式,所以它做出来的界面总是很死板,不美观,偏题了,实际上J2ME的awt我只是10年前粗略了解了一下,很肤浅.我猜测TextArea采用flowlayyout主要还是基于移动终端的屏幕分辨率差异太大,所以它需要一种可以自动适应的布局,以便在不同的设备上界面不会变形太厉害.让文本域可以自动缩展,由此带来一个问题就是,textarea分词的时候可以不管本身能占用多大的空间,反正我就一个个放text,最后由layout自己决定什么时候换行,设置于调试时你可以发现,分词时textarea的width/height/x/y全部都是0,它连自己的位置都还不知道,根本无法获得宽度并以此进行断行.而且中文有其特殊性,每个字作为一个word的话,几页的文字就会内存溢出了,而如果每行作为一个Text的话理论上就可以多显示10几倍内容,当然,不是所有的应用都有这个需求,这说明我这个人太爱钻牛角尖了. 一开始我的想法是在样式表中增加width属性(Kuix所有的widget是没有width/height属性的,只有minsize,然后根据内容自动扩展),设置width让我回归到很熟悉的css样式表,但是出现其他问题,一个是Kuix.alert等弹出对话框文字也是用textrarea,其大小是根据屏幕大小变化的,我无法为其设置width属性,除非我修改Kuix所有popup对话框,而且这样我必须设置所有文本框的宽度,调试起来很麻烦,还不能适应不同大小的屏幕,这和作者原来的思想背离了. 然后就有了折衷的方法,在显示不多的文字时,按照默认的1汉字1词来分,在需要多行显示时,自动探测其父对象的宽度,计算自身的宽度 1 设置了width,按照设定大小拆分 2 增加fullscreeen属性,设置此属性后自动扩展填满父对象 3 按照1汉字1词拆分. 这里再次给出3的拆词函数,原函数有bug
private void splitWords2(String fullText, int style) { String str = fullText;//+" "; String word=""; int len = str.length()-1; for (int i = 0; i <= len; i++) { char ch = str.charAt(i); word = word + ch; if ((ch >= 48 && ch <= 57) || (ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122)) continue; if (word.length() != 0 || i==len) { Text textWidget = new Text(); textWidget.setText(word); if (style != Font.STYLE_PLAIN) { textWidget.setDefaultFontStyle(style); } add(textWidget); word = ""; } } if(!word.equals("")){ Text textWidget = new Text(); textWidget.setText(word); if (style != Font.STYLE_PLAIN) { textWidget.setDefaultFontStyle(style); } add(textWidget); } } 总结一下我的修改内容: 1 允许弹出编辑内容的窗口 2 styled=true时解析 为空格(原来的解析器不知为何没有做空格的转义),增加对不分不规范标签的处理,如<BR>没有结束标签,标签大小写不匹配,属性值没有用括号括起等 3 style=false时接收回车换行, 4 中文的换行处理,同时改进英文的拆词方式
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-09-21
大哥,你kuix用得好熟啊,我有一个问题很急:
我想动态的增加一个list(Widget)里的数据,我通过id能够取到这个list,但是用它的add(Widget widget)这个方法添加了listitem后,在页面上始终不能显示,请问下这是为什么呢,有解决的办法吗?真的很急,这个做不了 ,很多功能都做不下去了。 |
|
返回顶楼 | |
发表时间:2010-09-21
找到问题所在了,原来是自己粗心。
|
|
返回顶楼 | |
发表时间:2010-09-28
问下你那个“自动探测其父对象的宽度,计算自身的宽度”是如何做出来的,可以参考下代码吗?
|
|
返回顶楼 | |
浏览 3702 次