打开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
分享到:
相关推荐
1. **`title`**:此属性为输入框添加一个提示标题,通常显示为小提示文本。 2. **`type`**:默认值为`text`,表示普通的文本输入。如果设置为`password`,则输入的文本会被隐藏,显示为星号(\*)。 3. **`name`**:这...
`<p>`标签用于展示段落文本,`<a>`标签创建了一个链接,`<form>`标签则用于创建表单,`<input>`定义了输入框,`<submit>`定义了一个提交按钮。 <四>、导航与链接 WML 中的链接和 HTML 类似,但有一些区别。在 WML ...
这个例子中,用户可以在名为"txtName"的输入框中输入信息,点击"提交"后,通过`onDone`属性触发服务器端的"processForm"处理,然后跳转到"nextDeck"的deck。 **六、WML与XHTML MP比较** 1. **语法差异**:XHTML MP...
- `<input>`:用于创建表单元素,如文本输入框、选择框等。 - `<select>`和`<option>`:用于创建下拉列表。 - `<go>`:通过指定URL进行页面跳转。 - `<postfield>`:用于在请求中发送数据。 3. **WML 语法** -...
WML,全称Wireless Markup Language,是一种专为无线设备如早期的移动电话设计的标记语言,用于创建适应小型屏幕和有限功能的移动浏览器的网页。WML是XML的一个子集,主要用于创建在GPRS、WAP等早期移动网络环境下...
WML(Wireless Markup Language)是一种专为移动设备设计的标记语言,主要用于创建适应小型屏幕的交互式应用程序,尤其是早期的移动互联网应用。WML是XML的一个子集,因此它遵循XML的规则和结构。 1. **属性** 在...
**WEB开发中的WML输入详解** 在Web开发领域,特别是在早期的移动互联网环境中,WML(Wireless Markup Language)是一种专门用于创建无线设备友好界面的标记语言。它被设计用来优化小屏幕设备上的内容显示,如早期的...
- **size** 属性:定义输入框的显示宽度,当前版本的WML可能不支持。 - **tabindex** 属性:类似于HTML表单中的TAB索引,定义了输入框的选择顺序。数字越大,位置越靠后。 #### 示例代码分析 以下是一个具体的示例...
例如,下面这个文档将带有一段 JavaScript 代码,用于拼接两个输入框中的字符串,并且弹出窗口显示。 测试二 <input id="firstNameInput" type="text"/> <input id="lastNameInput" type="text"/> <input ...
HTML中的`<input type=”text” name=”xxx”/>`是一个输入框元素,允许用户在网页上输入文本。 HTML的历史发展包括: 1. 1999年发布的HTML,随后出现了XHTML,它是HTML的一个增强版,更加严格遵循XML的语法。 2. ...
7. 最后,使用JSF标签与后台bean交互,如<h:inputText value="#{MyBeanName.name}">,这将把输入框的值绑定到后台bean的name属性。 四、ADF(ArcObjects for Java)体系结构与定制 ADF是ArcGIS Server Java中的一...
例如,`<input type=”text” name=”xxx”/>`表示一个输入框,用户可以在其中输入文本。 HTML的历史可以追溯到1999年,当时HTML被广泛使用,随后XHTML(Extensible HyperText Markup Language)成为HTML的一个增强...