`

为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
分享到:
评论

相关推荐

    WML教程之文本框控件Input

    1. **`title`**:此属性为输入框添加一个提示标题,通常显示为小提示文本。 2. **`type`**:默认值为`text`,表示普通的文本输入。如果设置为`password`,则输入的文本会被隐藏,显示为星号(\*)。 3. **`name`**:这...

    wml标记及语法.doc

    `<p>`标签用于展示段落文本,`<a>`标签创建了一个链接,`<form>`标签则用于创建表单,`<input>`定义了输入框,`<submit>`定义了一个提交按钮。 <四>、导航与链接 WML 中的链接和 HTML 类似,但有一些区别。在 WML ...

    wml基础实例教程

    这个例子中,用户可以在名为"txtName"的输入框中输入信息,点击"提交"后,通过`onDone`属性触发服务器端的"processForm"处理,然后跳转到"nextDeck"的deck。 **六、WML与XHTML MP比较** 1. **语法差异**:XHTML MP...

    WML 参考手册.doc

    - `<input>`:用于创建表单元素,如文本输入框、选择框等。 - `<select>`和`<option>`:用于创建下拉列表。 - `<go>`:通过指定URL进行页面跳转。 - `<postfield>`:用于在请求中发送数据。 3. **WML 语法** -...

    wml试练(1) wml基础教程

    WML,全称Wireless Markup Language,是一种专为无线设备如早期的移动电话设计的标记语言,用于创建适应小型屏幕和有限功能的移动浏览器的网页。WML是XML的一个子集,主要用于创建在GPRS、WAP等早期移动网络环境下...

    WML元素及其语法格式一览表

    WML(Wireless Markup Language)是一种专为移动设备设计的标记语言,主要用于创建适应小型屏幕的交互式应用程序,尤其是早期的移动互联网应用。WML是XML的一个子集,因此它遵循XML的规则和结构。 1. **属性** 在...

    WEB开发 之 WML 输入.docx

    **WEB开发中的WML输入详解** 在Web开发领域,特别是在早期的移动互联网环境中,WML(Wireless Markup Language)是一种专门用于创建无线设备友好界面的标记语言。它被设计用来优化小屏幕设备上的内容显示,如早期的...

    WML学习之五 显示表单

    - **size** 属性:定义输入框的显示宽度,当前版本的WML可能不支持。 - **tabindex** 属性:类似于HTML表单中的TAB索引,定义了输入框的选择顺序。数字越大,位置越靠后。 #### 示例代码分析 以下是一个具体的示例...

    web前端发展简史[参考].pdf

    例如,下面这个文档将带有一段 JavaScript 代码,用于拼接两个输入框中的字符串,并且弹出窗口显示。 测试二 <input id="firstNameInput" type="text"/> <input id="lastNameInput" type="text"/> <input ...

    arcgis server java

    7. 最后,使用JSF标签与后台bean交互,如<h:inputText value="#{MyBeanName.name}">,这将把输入框的值绑定到后台bean的name属性。 四、ADF(ArcObjects for Java)体系结构与定制 ADF是ArcGIS Server Java中的一...

Global site tag (gtag.js) - Google Analytics