背景
開發的Android TV應用時,有一個做題模塊用到了WebView做爲題目和選項的展示容器
問題
對於正常的文字內容來說,在相應元素中使用tabindex屬性即可實現焦點的簡單控制,但是此處展示的題目和選項會涉及到公式,相應位置已用MathJax做了轉換,經過轉換後用圖形化的公式替代了文字符號描述,在焦點控制上就出現了問題,這些公式會獲取到焦點,導致遙控器在選項間切換時焦點會跳到公式上,無法正確切換選項
解決過程
剛開始的時候嘗試了tabindex以及各種屬性試圖讓內容無法獲取焦點,均告失敗
嘗試手動控制焦點的切換
1. 監聽遙控器按鍵輸入
問題:開始是在js中做了監聽,發現按鍵的響應要到WebView上需要多按一次按鍵才行
解決:改爲在activity中監聽按鍵輸入
2. 通過id獲取到元素,調用focus方法獲取焦點
問題:即使手動控制焦點的切換,公式仍舊會獲取到焦點
解決:在這一塊卡了很久,其實想想是鑽了牛角尖了,太過糾結於公式和選項之間焦點的交互,在禁用了WebView獲取焦點後,即便公式也是無法再獲得焦點了,最終的焦點就能由自己手動控制了,此處焦點禁用使用clearFocus()方法,在監聽每次按鍵時執行
3. 通過WebView和原生代碼的交互,對應按鍵按下時做選項的焦點控制
問題:由於清除了WebView的焦點,在按ok鍵確定選擇時,js的onclick方法失效
解決:監聽上下按鍵時記錄下當前焦點所在的選項,在按下ok鍵時根據記錄下的選項做下一步的操作
4. 確定選項後會判斷對錯並給出解答,焦點移動到WebView上後,長按下鍵可以滾動WebView查看
問題:查看完以後,選擇跳轉下一題,題幹上方出現一大片空白
解決:嘗試了各種scroll滾動,都不太滿意,查看解答部分出現的代碼,是調用了SlideDown方法,而在新題初始化後調用的是hide方法隱藏瞭解答部分,導致頁面高度突然改變,出現空白,將hide換做SlideUp方法,雖然會有解答部分隱藏的畫面,但問題算是解決了,後續可以在控制SlideUp的速度,或者獲取到題幹距離頂部的距離,調用window的scrollTo方法滾動頂部
總結
差不多就這些,其中還有些關於焦點的小細節不再贅述,最重要的是跳出思維定勢,把握主要矛盾,靈活運用各種api