论坛首页 移动开发技术论坛

Kuix 教程8 中文的自动断行2

浏览 3701 次
精华帖 (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时解析&nbsp;为空格(原来的解析器不知为何没有做空格的转义),增加对不分不规范标签的处理,如<BR>没有结束标签,标签大小写不匹配,属性值没有用括号括起等

3 style=false时接收回车换行,

4 中文的换行处理,同时改进英文的拆词方式

 

 

   发表时间:2010-09-21  
大哥,你kuix用得好熟啊,我有一个问题很急:
我想动态的增加一个list(Widget)里的数据,我通过id能够取到这个list,但是用它的add(Widget widget)这个方法添加了listitem后,在页面上始终不能显示,请问下这是为什么呢,有解决的办法吗?真的很急,这个做不了 ,很多功能都做不下去了。
0 请登录后投票
   发表时间:2010-09-21  
找到问题所在了,原来是自己粗心。
0 请登录后投票
   发表时间:2010-09-28  
问下你那个“自动探测其父对象的宽度,计算自身的宽度”是如何做出来的,可以参考下代码吗?
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics