1. 程式人生 > >【Android問題及其解決】Android WebView 和 Soft keyboard 的顯示隱藏問題

【Android問題及其解決】Android WebView 和 Soft keyboard 的顯示隱藏問題

問題描述:     業務要求,使用webView來展示網頁內容。在網頁中,有<input>標籤的輸入框,通過點選輸入框,彈出系統軟鍵盤進行輸入。但是無論是android 虛擬機器還是實體機上,都無法第一時間彈出軟鍵盤。通過操作應用,反而發現將應用前後臺進行切換一下,再切入前臺展示webView,此時的軟鍵盤就能夠正常彈出。     顯然這個問題中軟鍵盤的是否彈出與當前展示的view的焦點獲取息息相關。     網上百度關鍵字之後,很多都是建議去強制獲取一下焦點,再用輸入框物件將輸入法強制彈出來。 setFocusable(true); setFocusableInTouchMode(true); requestFocus(View.FOCUS_DOWN);//與方法 requestFocus() 效果是一樣的     問題中獲取焦點的檢視是一個 WebView ,無論是在佈局中新增索取焦點的屬性,還是在程式碼中新增上述程式碼要求獲取一下焦點,在點選網頁輸入框都無法彈出軟鍵盤。通過在 StackOverFlow 上搜相關問題,搜尋到一個比較相關的 Tapping form field in WebView does not show soft keyboard其中也是在於如何使得 WebView 獲取焦點的問題上,又多瞭如下程式碼,加上之後仍然是沒有作用。 webview.setOnTouchListener(new View.OnTouchListener() {     @Override     public boolean onTouch(View v, MotionEvent event) {         switch (event.getAction()) {             case MotionEvent.ACTION_DOWN:             case MotionEvent.ACTION_UP:                 if (!v.hasFocus()) {                     v.requestFocus();                 }                 break;             }         return false;        } });     接著又想到另一個辦法,就是在前端的 js 程式碼中監聽 <input> 標籤的點選事件,通過 JSBridge 來通知客戶端強制彈出軟鍵盤,但是使用 WebView 當做引數呼叫 InputMethodManager 強制彈出鍵盤無法成功,原來傳入的引數 View 物件也是有要求的,原理如下。 系統中控制輸入法都是由 InputMethodManager 來進行互動的,而其中控制鍵盤顯示隱藏的方法根據參賽型別可以分為兩類,一類是通過傳入View當做引數,另一類是通過傳入 IBinder 型別的 windowToken 當做引數(通過 View.getWindowToken() 方法獲取)。其中 View 必須是可以接受輸入的檢視,什麼是可以接受輸入的檢視呢?在 View 中有這樣幾個方法。
//由 InputMethodManager 類來呼叫,用來檢查這個 View 型別物件是否是可以被當做接收輸入法輸入的檢視,預設返回是 false public boolean checkInputConnectionProxy(View view){     return false; } //返回被呼叫者的這個 View 型別物件是否是一個文字輸入框型別的檢視,如果返回是 true ,同時需要實現 onCreateInputConnection(EditorInfo outAttrs) 這個方法 public boolean onCheckIsTextEditor(){     return false; } //允許獲取焦點且接受文字輸入的 View 型別物件需要實現,通過返回 InputConnection 型別物件來與輸入法進行互動 public InputConnection onCreateInputConnection(EditorInfo outAttrs){     return null; }     顯然 WebView 也不是一個可以接受文字輸入的物件,因此通過 JSBridge 的想法也走不通了。     斷點的過程中,發現展示過程中的 WebView 觸控監聽中,是一直處於獲取了焦點的狀態中,然後前後臺一切換再回到應用,斷點顯示方法呼叫沒有不同的地方,那這個過程中唯一變化的就是 WebView 的焦點了,經歷了獲取焦點->失去焦點->獲取焦點的過程,那會不會就是由於焦點一直不變,才導致了鍵盤彈不出來?之後,在進入 WebView ,網頁載入完成之後,快速彈了一個透明的對話方塊,然後快速消失,視覺上感受不到彈框,去搶佔了一下焦點,焦點發生變化,此時再去點選網頁中的輸入框,軟鍵盤正常彈出了。     既然解決了 WebView 中輸入框點選軟鍵盤無法彈出的問題,如果有需求要求不允許彈出系統的軟鍵盤或者只能彈出自定義的某個鍵盤,那麼該如何處理?根據前面的可以接受輸入的檢視才能和鍵盤輸入法進行互動,那麼把這些“可以接受輸入的檢視”變成不可接受輸入的檢視,鍵盤自然就彈不出來了,即呼叫方法 setFocusable(false); 傳入 false 進去,再在相關 View 物件上新增點選或者觸控的監聽,監聽中新增業務即可。

相關推薦

Android問題及其解決Android WebView Soft keyboard顯示隱藏問題

問題描述:     業務要求,使用webView來展示網頁內容。在網頁中,有<input>標籤的輸入框,通過點選輸入框,彈出系統軟鍵盤進行輸入。但是無論是android 虛擬機器還是實體機上,都無法第一時間彈出軟鍵盤。通過操作應用,反而發現將應用前後臺進行切換一

Android Studio開發Android Studio如何獲取versionnameversioncode

在eclipse中我們很清楚可以用下面的程式碼獲取到versionname和versionname //eclipse獲取versioncode和versioncode public void getEclipseVersionInfo(){ int versio

解決Android Studio無法顯示Design檢視

用Android Studio開發Android程式發現無法顯示視覺化編輯介面,也就是Design檢視。如下圖: 點選Details,錯誤資訊如下: 這是Android SDK 版本問題導致的錯誤,更改SDK版本即可 若只有一個可用API,可通

Android基礎知識使用HttpHttpClient上傳檔案

public class UploadThread extends Thread{ private String fileName; private String url; public UploadThread(String fileName,String url){ this.fileName

解決Android studio中ADB啟動失敗,導致找不到虛擬機器或真機

adb server version (31) doesn't match this client (36); killing... error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037: 通常每個套接字

走過巨坑android studio對於jni呼叫及執行閃退無法載入庫的問題解決方案

相信很多小夥伴都在android開發中遇到呼叫jni的各種巨坑,因為我們不得不在很多地方用到第三方庫so檔案,然而第三方官方通常都只會給出ADT環境下的整合方式,而谷歌親兒子android studio預設採用的卻是gradle方式,與ADT編輯的方式大不相同,那再andorid studio中如何匯入so

Android基礎知識使用GalleryImageSwitcher實現圖片輪播效果

使用Gallery和ImageSwitcher實現滑動Gallery,切換ImageSwitcher的圖片。 佈局檔案 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

拍照截圖Android 系統拍照截圖

tjstudy:寫在前面: android 6.0 許可權未處理,這裡只是對拍照和截圖的過程進行了知識的清理總結。 android6.0 許可權處理,可跳轉到: 大力哥的,http://download.csdn.net/detail/qq13772269

Android效能優化Android圖片載入方案--Bitmap的記憶體管理優化方案

如果你覺得對你有幫助的話,希望可以star/follow一下喲,我會持續保持更新。 寫在前面:筆者的上一篇博文有提到過,如果不恰當的使用Bitmap,很容易造成OOM。這篇博文就來談談應該如何正確的管理Bitmap的記憶體,以及優化策略。

異常解決android.content.ActivityNotFoundException

08-13 18:29:22.924: E/AndroidRuntime(1875):Caused by: java.lang.ClassNotFoundException:XXXXX in loader dalvik.system.PathClassLoader[/data/app/XXXX.apk]

實例演示Android安全須知

Android;移動安全;四維創智軟件免費像是一種潮流,收費軟件生存空間變小,只能變向獲利。 於是..... app加入信息搜集,用戶行為收集,植入廣告,留後門。 為了利益,修改帶資金的app,竊取用戶資金。 app加入挖礦功能,挖黑金。 利用第三方sdk接口收集用戶信息。 app中插入廣告鏈接。 app中植

音視頻Android CallLib 開發指南

SDK 音視頻 開通方式音視頻服務開通,請參考音視頻開通方式說明。使用說明由於底層引擎技術不同,2.6.0 之後的音視頻 SDK 與 2.6.0 之前的 SDK 中的實時音視頻不能互通。音視頻 SDK 為商用收費功能,之前的 SDK 中的實時音視頻為免費測試功能,如果您還想使用之前的實時音視頻,可以使

Android學習筆記Android Studio簡單斷點調試

分享 遇到 跟著 相關 斷點調試 .com 完整 android學習 force 首先點擊斷點調試按鈕運行App 啟動之後,會彈出如下圖的提示框,不要管,幾秒之後這個彈框會自動消失,然後App會成功運行。 下面介紹一下斷點調試的相關操作按鈕對應的功能: 按鈕1的功能:

Android開發經驗android:windowSoftInputMode屬性具體解釋

中一 mtk wid water ren 而是 orien 表示 不能 本文章來自CSDN博客:http://blog.csdn.net/zhaokaiqiang1992。轉載請註明地址! 在前面的一篇文章中,簡單的介紹了一下怎樣實現軟鍵盤不自己主動彈出,使

輸出文件 Android 加密 模組原始碼分析

                                   Android6.0 加密模組解析

輸出文件 Android 儲存模組 解析

  【儲存模組培訓文件,很認真寫的,現在轉移到部落格上】                                

輸出文件 Android MountService 原始碼分析

Android 儲存裝置管理框架 在android之VOLD程序啟動原始碼分析一文中介紹了儲存裝置的管控中心Vold程序,Vold屬於native後臺程序,通過netlink方式接收kernel的uevent訊息,並通過socket方式將uevent訊息傳送給MountService,同時實時接

輸出文件 Android 6 USB 模組解析

          USB模組解析 簡介 主要完成USB 功能的切換和狀態的更新。通過接受kernel傳送過來的event訊息來確定USB狀態的切換並向外界傳送廣播訊息。  

達內課程Android中的Notification

什麼是通知 通知是Android中Service與使用者互動的一種方式(主要是Service) 一個傳送通知的栗子: private static final int NOTIFICATION_ID = 1001; private void sendNotificati

銀聯支付Android studio版本的銀聯支付Demo

首先看一下效果圖: 注意:本Demo使用的銀聯SDK版本:3.1.0 更新時間:2017-08-02 概述         銀聯手機支付控制元件(以下簡稱支付控制元件),主要為合作商戶的手機客戶端提供安全、便捷的支付服務。使用