原本以为关于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 中文的换行处理,同时改进英文的拆词方式