为Android添加对WML的支持 (二)——添加支持WML输入框 input

打开wml开关后,wml网页已经可以解析显示出来了,但是发现input输入框不能正常工作。

表现为点击之后直接崩溃或者点击之后不能输入文字。

 

这个问题主要是webkit与android framework的衔接有问题。看下面示意图:


Framework中的webview(UI)总是要与Webkit中的WMLInputElement打交道的,主要内容就两个

1.       点击事件。

webview需要通知input输入框各种点击事件,这条通知路径是通过Webviewcore最终到达WMLInputElement节点。

2.       获取当前节点的属性。这条通信路径是通过webview.cpp最终到达CacheBuild.cpp.
这里解释一下CacheBuild,cachebuild可以认为是DOM树的某种复制,但是会对树中元素做一些新的诠释。

 

 

那么现在要解决WML输入框的问题,就只要将JNI部分处理OK就好了。具体还是两部分:

1.       点击事件。

如上面所述,只要处理好webviewcore.cpp即可。搜素所有与htmlInput相关的关键字,对应生成一份wmlinput的处理代码。实际以android4.0为例,只要处理handleMouseClick()。

2.       获取Node属性。

对应的处理webview.cpp, 但是webview.cpp实际不区分是wmlinput还是html input,所以需要往下走一步,来到cacheBuild.cpp。 还是老样子,搜索所有与html input相关的内容,对应生成一份wml inut的代码。实际以android4.9为例,只有BuildFrame()一个地方。

题外话:当初这一步没做,发现输入框也能正常写入内容,但是会有各种奇怪的表现。最典型的就是输入文字时不能输入词组,每次都只会输入一个字符。

 

另外,android4.0 webkit框架部分有所改动,实际还碰到两个问题:

a. 提交输入框内容时总是为空。

原因是没有调用setValueFromRenderer()将UI控件中的值也就是我们看到的内容赋值给WMLinputElement。

android2.3的时候是在TextControlInnerTextElement::defaultEventHandler()中处理的,现在android4.0改了。参考HtmlInputElement,发现完全照搬有些困难,就直接在WmlInputElement的defaultEventHandler()中做了处理。

if (event->type() ==eventNames().webkitEditableContentChangedEvent && renderer() &&renderer()->isTextControl()) {

       toRenderTextControl(renderer())->subtreeHasChanged();

 

b. 提交一次后,返回网页,然后再进入。发现WmlInputElement中刚才的提交内容都在,但是直接看不到,点击输入框后可以看到。

没办法,不知道怎么改UI,直接就将WML的缓存机制(pageStage)灭了。在initialize()方法中总是将初始值设为空。

更多详细信息请查看 java教程网 http://www.itchm.com/forum-59-1.html