Android鍵盤顯示和隱藏

来源:https://www.cnblogs.com/qynprime/archive/2018/01/22/8330543.html
-Advertisement-
Play Games

一、不自動彈出鍵盤: 帶有EditText控制項的在第一次顯示的時候會自動獲得focus,並彈出鍵盤,如果不想自動彈出鍵盤,有兩種方法: 方法一:在mainfest文件中把對應的activity設置 android:windowSoftInputMode="stateHidden" 或者android ...


一、不自動彈出鍵盤:

帶有EditText控制項的在第一次顯示的時候會自動獲得focus,並彈出鍵盤,如果不想自動彈出鍵盤,有兩種方法:

方法一:在mainfest文件中把對應的activity設置

android:windowSoftInputMode="stateHidden" 或者android:windowSoftInputMode="stateUnchanged"。

 

 

 

描述

"stateUnspecified"

軟鍵盤的狀態 (是否它是隱藏或可見 )沒有被指定。系統將選擇一個合適的狀態或依賴於主題的設置。

這個是為了軟體盤行為預設的設置。

"stateUnchanged"

軟鍵盤被保持無論它上次是什麼狀態,是否可見或隱藏,當主視窗出現在前面時。

"stateHidden"

當用戶選擇該 Activity時,軟鍵盤被隱藏——也就是,當用戶確定導航到該 Activity時,而不是返回到它由於離開另一個 Activity。

"stateAlwaysHidden"

軟鍵盤總是被隱藏的,當該 Activity主視窗獲取焦點時。

"stateVisible"

軟鍵盤是可見的,當那個是正常合適的時 (當用戶導航到 Activity主視窗時 )。

"stateAlwaysVisible"

當用戶選擇這個 Activity時,軟鍵盤是可見的——也就是,也就是,當用戶確定導航到該 Activity時,而不是返回到它由於離開另一個Activity。

"adjustUnspecified"

它不被指定是否該 Activity主 視窗調整大小以便留出軟鍵盤的空間,或是否視窗上的內容得到屏幕上當前的焦點是可見的。系統將自動選擇這些模式中一種主要依賴於是否視窗的內容有任何佈局 視圖能夠滾動他們的內容。如果有這樣的一個視圖,這個視窗將調整大小,這樣的假設可以使滾動視窗的內容在一個較小的區域中可見的。這個是主視窗預設的行為 設置。

"adjustResize"

該 Activity主視窗總是被調整屏幕的大小以便留出軟鍵盤的空間

"adjustPan"

該 Activity主視窗並不調整屏幕的大小以便留出軟鍵盤的空間。相反,當前視窗的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分。這個通常是不期望比調整大小,因為用戶可能關閉軟鍵盤以便獲得與被覆蓋內容的交互操作。

 

這種方式編輯框還有游標。隱藏游標的方法:EditText.setCursorVisible(false)。

方法二:可以在佈局中放一個隱藏的TextView,然後在onCreate的時候requsetFocus。

註意TextView不要設置Visiable=gone,否則會失效,可以在佈局中放一個隱藏的TextView,然後在onCreate的時候requsetFocus

<TextView

        android:id="@+id/text_notuse"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:focusable="true"

  android:focusableInTouchMode="true"/>

  TextView textView = (TextView)findViewById(R.id.text_notuse);

       textView.requestFocus();

二、手動顯示和隱藏系統鍵盤

1、方法一(如果輸入法在視窗上已經顯示,則隱藏,反之則顯示)。此方法使用尚不確定,不好使。

  InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  

  imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);  

 

2、方法二(view為接受軟鍵盤輸入的視圖,SHOW_FORCED表示強制顯示)

  InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  

  imm.showSoftInput(view,InputMethodManager.SHOW_FORCED);  

   該方法在activity或者fragment的onCreate(或者onCreateView)函數中去調用,發現並不起作用,這是因為在onCreate中或者其他聲明周期函數(onStart,onResume等)中,該EditText還未被繪製出來,InputMethodManager還不能獲取到該控制項的焦點,所以鍵盤並不會顯示,而且manager.showSoftInput函數返回false,告訴你鍵盤並未顯示。所以只有當EditText完全被繪製出來了,才可以去獲取焦點。

解決方法:

edittext.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
      @Override  
      public void onGlobalLayout() {  
          InputMethodManager manager = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE);  
          manager.showSoftInput(edittext, 0);  
      }  
});  

註意:這個監聽事件里最好不要放toggleSoftInput方法,不然鍵盤會不停閃爍。

 3、強制隱藏鍵盤  

  imm.hideSoftInputFromWindow(view.getWindowToken(), 0);  

註意:如果第二個參數為HIDE_NOT_ALWAYS,那麼當showSoftInput的第二個參數為SHOW_FORCED時,則隱藏不掉。

4、調用隱藏系統預設的輸入法

  ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);  (WidgetSearchActivity是當前的Activity)  

5、獲取輸入法打開的狀態

  InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);  

  boolean isOpen=imm.isActive();//isOpen若返回true,則表示輸入法打開  

6、InputMethodManager的常量:

    public static final int HIDE_IMPLICIT_ONLY

 

           hideSoftInputFromWindow(IBinder, int)中的標誌,表示如果用戶未顯式地顯示軟鍵盤視窗,則隱藏視窗。

 

           常量值: 1 (0x00000001)

 

 

 

    public static final int HIDE_NOT_ALWAYS

 

    hideSoftInputFromWindow(IBinder, int)中的標誌,表示軟鍵盤視窗總是隱藏,除非開始時以SHOW_FORCED顯示。

 

    常量值: 2 (0x00000002)

 

 

 

    public static final int RESULT_HIDDEN

 

 

 

    showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver結果代碼標誌:軟鍵盤視窗從顯示切換到隱藏時的狀態。

 

    常量值: 3 (0x00000003)

 

 

 

    public static final int RESULT_SHOWN

 

 

 

    showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver結果代碼標誌:軟鍵盤視窗從隱藏切換到顯示時的狀態。

 

    常量值: 2 (0x00000002)

 

 

 

    public static final int RESULT_UNCHANGED_HIDDEN

 

 

 

    showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver結果代碼標誌:軟鍵盤視窗不變保持隱藏時的狀態。

 

    常量值: 1 (0x00000001)

 

 

 

    public static final int RESULT_UNCHANGED_SHOWN

 

 

 

    showSoftInput(View, int, ResultReceiver)hideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiver結果代碼標誌:軟鍵盤視窗不變保持顯示時的狀態。

 

    常量值: 0 (0x00000000)

 

 

 

    public static final int SHOW_FORCED

 

    showSoftInput(View, int)標誌,表示用戶強制打開輸入法(如長按菜單鍵),一直保持打開直至只有顯式關閉。

 

    常量值: 2 (0x00000002)

 

 

 

    public static final int SHOW_IMPLICIT

 

      showSoftInput(View, int)標誌,表示隱式顯示輸入視窗,非用戶直接要求。視窗可能不顯示。

    常量值: 1 (0x00000001)

四、公共方法

    public void displayCompletions (View view, CompletionInfo[] completions)

    (譯者註:輸入法自動完成)

 

    public InputMethodSubtype getCurrentInputMethodSubtype ()

    (譯者註:獲取當前輸入法類型?)

 

    public List<InputMethodInfo> getEnabledInputMethodList ()

    (譯者註:獲取已啟用輸入法列表?)

 

    public List<InputMethodSubtype> getEnabledInputMethodSubtypeList (InputMethodInfo imi, boolean allowsImplicitlySelectedSubtypes)

 

    public List<InputMethodInfo> getInputMethodList ()

    (譯者註:獲取輸入法列表)

 

    public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsAndSubtypes ()

 

    public void hideSoftInputFromInputMethod (IBinder token, int flags)

    關閉/隱藏輸入法軟鍵盤區域,用戶不再看到或與其交互。只能由當前激活輸入法調用,因需令牌(token)驗證。

    參數

    token       在輸入法啟動時提供令牌驗證,驗證後可對其進行操作。

    flags        提供額外的操作標誌。當前可以為0或 HIDE_IMPLICIT_ONLYHIDE_NOT_ALWAYS等位設置。

 

    public boolean hideSoftInputFromWindow (IBinder windowToken, int flags)

      hideSoftInputFromWindow(IBinder, int, ResultReceiver)的無返回值版:從視窗上下文中確定當前接收輸入的視窗,隱藏其輸入法視窗

    參數

    windowToken 由視窗請求View.getWindowToken()返回得到的令牌(token)。

    flags        提供額外的操作標誌。當前可以為0或 HIDE_IMPLICIT_ONLY位設置。

 

    public boolean hideSoftInputFromWindow (IBinder windowToken, int flags, ResultReceiver resultReceiver)

    從視窗上下文中確定當前接收輸入的視窗,要求隱藏其軟鍵盤視窗。它可由用戶調用並得到結果而不僅僅是顯式要求輸入法視窗隱藏。

    參數

    windowToken 由視窗請求View.getWindowToken()返回得到的令牌(token)。

    flags        提供額外的操作標誌。當前可以為0或 HIDE_IMPLICIT_ONLY位設置。

        resultReceiver  如不為空,當IME處理請求告訴你完成時調用。你收到的結果碼可以是RESULT_UNCHANGED_SHOWNRESULT_UNCHANGED_HIDDENRESULT_SHOWN,或RESULT_HIDDEN

 

    public void hideStatusIcon (IBinder imeToken)

    (譯者註:隱藏狀態欄圖標?)

 

    public boolean isAcceptingText ()

    當前服務視圖接受全文編輯返回真。沒有輸入法聯接為false,這時其只能處理原始按鍵事件。

 

    public boolean isActive (View view)

    視圖為當前輸入的激活視圖時返回真。

 

    public boolean isActive ()

    輸入法中的任意視圖激活時返回真。

 

    public boolean isFullscreenMode ()

    判斷相關輸入法是否以全屏模式運行。全屏時,完全覆蓋你的UI時,返回真,否則返回假。

 

    public boolean isWatchingCursor (View view)

    如當前輸入法要看到輸入編輯者的游標位置時返回真。

 

    public void restartInput (View view)

    如有輸入法聯接至視圖,重啟輸入以顯示新的內容。可在以下情況時調用此方法:視圖的文字導致輸入法外觀變化或有按鍵輸入流,如應用程式調用TextView.setText()時。

             參數

    view        文字發生變化的視圖。

 

    public void sendAppPrivateCommand (View view, String action, Bundle data)

    對當前輸入法調用 InputMethodSession.appPrivateCommand()

             參數

    view         可選的發送命令的視圖,如你要發送命令而不考慮視圖附加到輸入法,此項可以為空。

    action      執行的命令名稱。必須是作用域的名稱,如首碼包名稱,這樣不同的開發者就不會創建衝突的命令。

    data         命令中包含的任何數據。

 

    public boolean setCurrentInputMethodSubtype (InputMethodSubtype subtype)

    (譯者註:此方法為3.0中新增的方法)

 

    public void setInputMethod (IBinder token, String id)

    強制切換到新輸入法部件。只能由持有token的應用程式(application)或服務(service) 調用當前激活輸入法。

             參數

    token       在輸入法啟動時提供令牌驗證,驗證後可對其進行操作。

    id              切換到新輸入法的唯一標識。

 

    public void setInputMethodAndSubtype (IBinder token, String id, InputMethodSubtype subtype)

    強制切換到一個新的輸入法和指定的類型。只能由持有token的應用程式(application)或服務(service) 調用當前激活輸入法。(譯者註:此方法為3.0中新增的方法)

             參數

    token       在輸入法啟動時提供令牌驗證,驗證後可對其進行操作。

    id              切換到新輸入法的唯一標識。

    subtype 切換到新輸入法的新類型。

 

    public void showInputMethodAndSubtypeEnabler (String topId)

    (譯者註:此方法為3.0中新增的方法)

 

    public void showInputMethodPicker ()

    (譯者註:顯示輸入法菜單列表)

 

    public boolean showSoftInput (View view, int flags, ResultReceiver resultReceiver)

    如需要,顯式要求當前輸入法的軟鍵盤區域向用戶顯示。當用戶與視圖交互,用戶表示要開始執行輸入操作時,可以調用此方法。

             參數

    view         當前焦點視圖,可接受軟鍵盤輸入。

    flags        提供額外的操作標誌。當前可以是0或SHOW_IMPLICIT 位設置。

    resultReceiver         如不為空,當IME處理請求告訴你完成時調用。你收到的結果碼可以是RESULT_UNCHANGED_SHOWNRESULT_UNCHANGED_HIDDEN,RESULT_SHOWN, 或 RESULT_HIDDEN 。

 

    public boolean showSoftInput (View view, int flags)

showSoftInput(View, int, ResultReceiver)的無返回值版:如需要,顯式要求當前輸入法的軟鍵盤區域向用戶顯示。

             參數

    view         當前焦點視圖,可接受軟鍵盤輸入。

    flags        提供額外的操作標誌。當前可以是0或SHOW_IMPLICIT 位設置。

 

    public void showSoftInputFromInputMethod (IBinder token, int flags)

    顯示輸入法的軟鍵盤區域,這樣用戶可以到看到輸入法視窗並能與其交互。只能由當前激活輸入法調用,因需令牌(token)驗證。

             參數

    token       在輸入法啟動時提供令牌驗證,驗證後可對其進行操作。

    flags        提供額外的操作標誌。可以是0或 SHOW_IMPLICITSHOW_FORCED位設置。

 

    public void showStatusIcon (IBinder imeToken, String packageName, int iconId)

    (譯者註:顯示狀態欄圖標?)

 

    public boolean switchToLastInputMethod (IBinder imeToken)

 

    public void toggleSoftInput (int showFlags, int hideFlags)

    (譯者註:切換軟鍵盤)

 

    public void toggleSoftInputFromWindow (IBinder windowToken, int showFlags, int hideFlags)

    本方法切換輸入法的視窗顯示。如輸入視窗已顯示,它隱藏。如無輸入視窗則顯示。

             參數

    windowToken  由視窗請求View.getWindowToken()返回得到的令牌(token)。

    showFlags       提供額外的操作標誌。當前可以為0或 HIDE_IMPLICIT_ONLY位設置。

    hideFlags         提供額外的操作標誌。可以是0或 HIDE_IMPLICIT_ONLYHIDE_NOT_ALWAYS位設置。

 

    public void updateCursor (View view, int left, int top, int right, int bottom)

    返回視窗的當前游標位置。

 

    public void updateExtractedText (View view, int token, ExtractedText text)

    (譯者註:當內容變化時文本編輯器調用此方法,通知其新提取文本。)

 

    public void updateSelection (View view, int selStart, int selEnd, int candidatesStart, int candidatesEnd)

返回當前選擇區域。   鳴謝:   http://blog.csdn.net/h7870181/article/details/8332991   http://blog.csdn.net/pi9nc/article/details/9196779   http://blog.csdn.net/lxlmycsdnfree/article/details/60962731

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 增 #1、沒有指定_id則預設ObjectId,_id不能重覆,且在插入後不可變 #2、插入單條 user0={ "name":"egon", "age":10, 'hobbies':['music','read','dancing'], 'addr':{ 'country':'China', 'c ...
  • 針對Oracle數據遷移,我們可能會用到expdp/impdp的方式,有時候需要大表、lob欄位等可能會消耗過大的臨時表空間和undo表空間,所以一般我們根據導出日誌,在導入前適當調整表空間大小。否則我們可能會遇到以下問題: 1、臨時表空間爆滿,無法擴展 ORA-1652: unable to ex ...
  • 1.Redis簡介 Redis 是一個開源(BSD許可)的,記憶體中的數據結構存儲系統,它可以用作資料庫、緩存和消息中間件。 它支持多種類型的數據結構,如 字元串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, b ...
  • 本文是對自己學習過程的一個記錄和彙總,作為自己的一個總結性的文檔,並隨著進度更新完善。作為一個初學者,文章若有不妥之處還請各位讀者提出來,大家共同交流進步,謝謝! OSM地圖數據下載: osm是一個開放式線上地圖平臺,Open Street Map(簡稱 OSM)是一個存儲海量XML 數據的資料庫( ...
  • 1、關係的集合運算 集合的3個最普通的運算是並、交和差。對於任意集合R和S(當然,這裡的R和S可以是表R和表S),這些運算定義如下。 R並S,R或S或兩者中元素的集合。一個元素在並集中只出現一次,即使它在R和S中都存在。 R交S,R和S中都存在的元素的集合。 R差S,在R中而不在S中的元素的集合。註 ...
  • 資料庫存放數據的文件,本文稱其為data file。 資料庫的內容在記憶體里是有緩存的,這裡命名為db buffer。某次操作,我們取了資料庫某表格中的數據,這個數據會在記憶體中緩存一些時間。對這個數據的修改在開始時候也只是修改在記憶體中的內容。當db buffer已滿或者遇到其他的情況,這些數據會寫入d ...
  • 2006年google技術人員Fay Chang發佈了一篇文章《Bigtable: A Distributed Storage System for Structured Data》。該文章向世人介紹了一種分散式的資料庫,這種資料庫可以在局部幾台伺服器崩潰的情況下繼續提供高性能的服務。 2007年P ...
  • 在開發項目之前,我們需要做一些準備工作,瞭解iOS擴展——Objective-C開發編程規範是進行開發的必備基礎,學習iOS學習——Xcode9上傳項目到GitHub是我們進行版本控制和代碼管理的選擇之一,明白iOS學習——iOS項目Project 和 Targets配置詳解則更利於我們今天對完整項 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...