爲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