A. android 輸入法窗口焦點獲取流程(2) ,輸入法窗口和應用窗口綁定
基於Android9.x
Window和Session創建成功後,窗口的下一步流程為獲取焦點
我們看下焦點獲取過程,跟輸入法相關的流程
兩個Activity切換時,對應的狀態變化過程為:
以下是Activity窗口初次獲取焦點的流程
當兩個activity 切換時,失去焦點的窗口調用過程如下:
對應的,獲取焦點的額窗口的調用過程如下:
當B窗口的狀態切換到RESUMED時,當窗口的focus可能變化時,會調用updateFocusedWindowLocked
在該方法中,判斷,如果還沒有執行startInputInner方法,則執行startInputInner方法,否則,直接執行startInputOrWindowGainedFocus方法
主要流程:
1:設置controlFlags的flag為CONTROL_WINDOW_FIRST
2:檢查是否已經執行過startInputInner,沒有的話執行startInputInner-->startInputOrWindowGainedFocus;否則,直接執行startInputOrWindowGainedFocus
兩條路徑,攜帶的startInputReason參數不一樣
主要流程:
1:檢查要啟動和退出的ServedView是否為同一個,如果為同一個,則表示已經執行過startInputInner,則返回false,表示不再執行startInputInner
2:如果獲取焦點的是EditorText,會創建跟IMS通信的mServedInputConnectionWrapper對象
主要流程:
1:創建EditorInfo對象tba,這個參數對TextView布局才有意義,它的初始化是在mServedView的onCreateInputConnection完成實例化的
2:根據EditorInfo創建一個InputConnection對象,輸入法應用通過該對象,完成輸入內容到輸入框的傳遞;ACTIVITY獲取焦點場景,該對象
為null,因為沒有要輸入的對象
startInputOrWindowGainedFocus攜帶的參數
startInputReason = 1
表示,該流程是窗口獲取焦點過程
mClient
應用層創建的IInputMethodClient對象,為服務層提供應用層的各個回調方法
該方法跟應用進程首次創建時Session時,傳遞到IMMS的對象是同一個對象
windowGainingFocus:
應用層的ViewRootImpl$W對象
controlFlags |= CONTROL_START_INITIAL;
表示window窗口剛開始獲取焦點
softInputMode = SOFT_INPUT_ADJUST_RESIZE , 允許調整輸入法窗口,避免被其他窗口遮擋
tba , EditorInfo對象
servedContext
null
missingMethodFlags
ic等於null的情況下,為0
當應用層傳遞的W對象windowToken不為null的時候,則創建windowGainedFocus對象,返回給app
結果返回後,會對IMM的對象進行賦值
如此,進入一個窗口,獲取窗口焦點過程,窗口與輸入法相關的流程,就結束了。
下一篇:輸入法在輸入框彈出流程
Android輸入法(3),彈出流程
B. android怎樣控制輸入法的彈出和隱藏
1.讓EditText失去焦點,使用EditText的clearFocus方法
2. 強制隱藏Android輸入法窗口,在IME類中我們通過
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 實例化輸入法控制對象,通過hideSoftInputFromWindow來控制,其中第一個參數綁定的為需要隱藏輸入法的EditText對象,比如imm.hideSoftInputFromWindow(etAndroid123.getWindowToken(), 0);
C. 關於Android中的軟鍵盤
原文鏈接:徹底搞定Android開發中軟鍵盤的常見問題
軟體盤的本質是什麼?軟鍵盤其實是一個Dialog。
InputMethodService為我們的輸入法創建了一個Dialog,並且將該Dialog的Window的某些參數(如Gravity)進行了設置,使之能夠在底部或者全屏顯示。當我們點擊輸入框時,系統對活動主窗口進行調整,從而為輸入法騰出相應的空間,然後將該Dialog顯示在底部,或者全屏顯示。
軟鍵盤顯示的調整
Android 定義了一個屬性,名字為windowSoftInputMode, 這個屬性用於設置Activity主窗口與軟鍵盤的交互模式,用於避免軟鍵盤遮擋內容的問題。我們可以在AndroidManifet.xml中對Activity進行設置。如:android:windowSoftInputMode=」stateUnchanged|adjustPan」。 該屬性可選的值有兩部分,一部分為軟鍵盤的狀態控制,控制軟鍵盤是隱藏還是顯示,另一部分是Activity窗口的調整,以便騰出空間展示軟鍵盤。 android:windowSoftInputMode的屬性設置必須是下面中的一個值,或一個」state」值加一個」adjust」值的組合,各個值之間用 | 分開。
stateUnspecified-未指定狀態 :當我們沒有設置android:windowSoftInputMode屬性的時候,軟體默認採用的就是這種交互方式,系統會根據界面採取相應的軟鍵盤的顯示模式。
stateUnchanged-不改變狀態 :當前界面的軟鍵盤狀態,取決於上一個界面的軟鍵盤狀態,無論是隱藏還是顯示。
stateHidden-隱藏狀態 :當設置該狀態時,軟鍵盤總是被隱藏,不管是否有輸入的需求。
stateAlwaysHidden-總是隱藏狀態 :當設置該狀態時,軟鍵盤總是被隱藏,和stateHidden不同的是,當我們跳轉到下個界面,如果下個頁面的軟鍵盤是顯示的,而我們再次回來的時候,軟鍵盤就會隱藏起來。
stateVisible-可見狀態 :當設置為這個狀態時,軟鍵盤總是可見的,即使在界面上沒有輸入框的情況下也可以強制彈出來出來。
stateAlwaysVisible-總是顯示狀態 :當設置為這個狀態時,軟鍵盤總是可見的,和stateVisible不同的是,當我們跳轉到下個界面,如果下個頁面軟鍵盤是隱藏的,而我們再次回來的時候,軟鍵盤就會顯示出來。
adjustUnspecified-未指定模式 :設置軟鍵盤與軟體的顯示內容之間的顯示關系。當你跟我們沒有設置這個值的時候,這個選項也是默認的設置模式。在這中情況下,系統會根據界面選擇不同的模式。
adjustResize-調整模式 :該模式下窗口總是調整屏幕的大小用以保證軟鍵盤的顯示空間;這個選項不能和adjustPan同時使用,如果這兩個屬性都沒有被設置, 系統會根據窗口中的布局自動選擇其中一個 。
adjustPan-默認模式 :該模式下通過不會調整來保證軟鍵盤的空間,而是採取了另外一種策略,系統會通過布局的移動,來保證用戶要進行輸入的輸入框肯定在用戶的視野范圍裡面,從而讓用戶可以看到自己輸入的內容。
案例
沒有滾動布局xml
對於沒有滾動控制項的布局來說,adjustPan就是默認的設置,比如我們案例應用中的文本輸入8,上面的文本輸入框123和按鈕都會被頂上去,且頁面布局不可以滾動。
對於沒有滾動控制項的布局來說,整個布局會網上偏移(包括標題等)以保證輸入框的可見。如果有滾動控制項,那麼就是內容網上偏移,標題不會動,還可以通關滾動來查看被頂上去的內容,而這點是不可滾動的布局所不具備的
有滾動布局xml
對於有滾動控制項的布局,則是採用的adjustResize方式,比如我們案例應用中的文本輸入8,上面的文本輸入框123和按鈕都會被頂上去, 可以通過滾動來查看被頂上去的內容。
** 根據這一原理,我們就可以把開發中遇到的軟鍵盤遮擋頁面的問題,利用ScrollView當做根布局,讓系統採用adjustResize模式,很好地解決這一問題。**
自動彈出軟鍵盤
有時候需要一進入Activity後就自動彈出軟鍵盤,可以通過設置一個時間函數來實現,具體寫法如下:
方法一:
方法二:
有時進入Activity後不希望系統自動彈出軟鍵盤,我們可以按照下面的方法來實現:
方法一:
在AndroidMainfest.xml中選擇那個activity,設置windowSoftInputMode屬性為adjustUnspecified|stateHidden
方法二:
讓EditText失去焦點,使用EditText的clearFocus方法
方法三:
強制隱藏Android輸入法窗口
方法四:
EditText始終不彈出軟體鍵盤
EditText設置ScrollView壓縮背景圖片解決辦法
在你的Activity里加上
有時希望根據條件動態關閉軟鍵盤,我們可以使用InputMethodManager類,按照下面的方法來實現:
方法一:
方法二:
強制隱藏軟鍵盤,這個方法倒是很實用。
方法三:
方法四:
在onclick事件下.以下方法可行.(如果是EditText失去焦點/得到焦點,沒有效果)
InputMethodManager的具體用法可以參考下面的鏈接: http://www.apihome.cn/api/android/InputMethodManager.html
使用android:imeOptinos可對Android自帶的軟鍵盤進行一些界面上的設置:
android:imeOptions="flagNoExtractUi" //使軟鍵盤不全屏顯示,只佔用一部分屏幕
同時,這個屬性還能控制項軟鍵盤右下角按鍵的顯示內容,默認情況下為回車鍵
android:imeOptions="actionNone" //輸入框右側不帶任何提示 android:imeOptions="actionGo" //右下角按鍵內容為'開始' android:imeOptions="actionSearch" //右下角按鍵為放大鏡圖片,搜索 android:imeOptions="actionSend" //右下角按鍵內容為'發送' android:imeOptions="actionNext" //右下角按鍵內容為'下一步' android:imeOptions="actionDone" //右下角按鍵內容為'完成'
同時,可能EditText添加相應的監聽器,捕捉用戶點擊了軟鍵盤右下角按鈕的監聽事件,以便進行處理。
開發中有個需求是將頁面底部的一個按鈕頂起,但是開發時發現Android5.0以後的版本設置了adjustResize屬性後無法成功頂起。糾結了好久,最後在stackoverflow找到解決方案,那就是在根布局上加上fitsSystemWindow=」true」即可。
這里的fitsSystemWindow具體的作用就是你的**contentview是否忽略actionbar,title,屏幕的底部虛擬按鍵,將整個屏幕當作可用的空間。 **
正常情況,contentview可用的空間是去除了actionbar,title,底部按鍵的空間後剩餘的可用區域;這個屬性設置為true,則忽略,false則不忽略
在edittext上加入Android:imeOptions=」actionSearch」這個屬性沒響應,最後發現在2.3及以上版本不起作用,解決方案:加上
因為輸入法鍵盤右下角默認的回車鍵本來就是換行用的,當設置單行後,回車換行就失去作用了,這樣就可以設置為搜索、發送、go等等。
D. android程序開發: 切換輸入法窗口如何打開
這個 應該只要在要輸入文字的地方長按就進去了 或者在設置-語言與輸入那設置就行了...
E. Android手機輸入法如何切換
若使用的是vivo手機,可以進入設置--系統管理/更多設置--輸入法--默認輸入法--切換至想要設置的輸入法即可。
F. android 怎麼顯示和隱藏鍵盤輸入法
工具:android
步驟:
方法一(如果輸入法在窗口上已經顯示,則隱藏,反之則顯示)。
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
方法二(view為接受軟鍵盤輸入的視圖,SHOW_FORCED表示強制顯示)。InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view,InputMethodManager.SHOW_FORCED);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0); //強制隱藏鍵盤
調用隱藏系統默認的輸入法。((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); (WidgetSearchActivity是當前的Activity)
獲取輸入法打開的狀態。
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
boolean isOpen=imm.isActive();//isOpen若返回true,則表示輸入法打開。
G. 安卓系統輸入法怎麼切換
若使用的是vivo手機,可查看切換手機輸入法方法:進入設置--系統管理/更多設置--輸入法--默認輸入法--切換至想要設置的輸入法即可;也可長按文本輸入區域,點擊切換圖標(輸入法)後選擇想要的輸入法。
H. 安卓手機如何安裝並設置輸入法
主界面=>菜單=>設置=>語音與鍵盤=>勾選新裝的輸入法,以後需要切換輸入法時長按輸入框即可.安卓系統如何切換輸入法
首先需要將您需要切換的輸入法下載在手機上 然後在菜單鍵-設置-語言和鍵盤/或者場所和文本裡面把安裝的輸入法打上勾
然後找個文本輸入框(就是可以輸入文字的窗口),一直點住文本輸入的框,會彈出輸入法,點它,然後選擇你需要輸入法就可以了。
安裝之後如果出現網頁不能縮放則重啟一次
I. android輸入法是怎樣調用的
Android軟鍵盤強制彈出及隱藏輸入法的方法:
很多應用中對於一個界面比如進入搜索界面或者修改信息等等情況,為了用戶體驗應該自動彈出軟鍵盤而不是讓用戶主動點擊輸入框才彈出(因為用戶進入該界面必然是為了更改信息)。具體實現這種效果的代碼如下:
java代碼
EditText editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.requestFocus();
InputMethodManager inputManager =
(InputMethodManager)editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(editText, 0);
首先要對指定的輸入框請求焦點。然後調用輸入管理器彈出軟鍵盤。
警告:對於剛跳到一個新的界面就要彈出軟鍵盤的情況上述代碼可能由於界面為載入完全而無法彈出軟鍵盤。此時應該適當的延遲彈出軟鍵盤如998毫秒(保證界面的數據載入完成)。實例代碼如下:
java代碼:
Timer timer = new Timer();
timer.schele(new TimerTask()
{
public void run()
{
InputMethodManager inputManager =
(InputMethodManager)editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(editText, 0);
}
},
998);
J. android 怎樣彈出選擇輸入法的對話框 如下圖
1.讓EditText失去焦點,使用EditText的clearFocus方法2.強制隱藏Android輸入法窗口,在IME類中我們通過InputMethodManagerimm=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);實例化輸入法控制對象,通過hideSoftInputFromWindow來控制,其中第一個參數綁定的為需要隱藏輸入法的EditText對象,比如imm.hideSoftInputFromWindow(etAndroid123.getWindowToken(),0);