要設置彈出鍵盤是否覆蓋Activity的view,或者軟鍵盤的顯示隱藏狀態,須要用到Activity的一個屬性:java
android:windowSoftInputModeandroid
該屬性在AndroidManifest.xml中設置,以下:app
<activity android:windowSoftInputMode=["stateUnspecified", "stateUnchanged", "stateHidden", "stateAlwaysHidden", "stateVisible", "stateAlwaysVisible", "adjustUnspecified", "adjustResize", "adjustPan"] …… > </activity>
值-----描述 | |
"stateUnspecified"-----軟鍵盤的狀態 (是否它是隱藏或可見 )沒有被指定。系統將選擇一個合適的狀態或依賴於主題的設置。ide 這個是爲了軟件盤行爲默認的設置。佈局 |
|
"stateUnchanged"-----軟鍵盤被保持不管它上次是什麼狀態,是否可見或隱藏,當主窗口出如今前面時。 | |
"stateHidden"-----當用戶選擇該 Activity時,軟鍵盤被隱藏——也就是,當用戶肯定導航到該 Activity時,而不是返回到它因爲離開另外一個 Activity。 | |
"stateAlwaysHidden"-----軟鍵盤老是被隱藏的,當該 Activity主窗口獲取焦點時。 | |
"stateVisible"-----軟鍵盤是可見的,當那個是正常合適的時 (當用戶導航到 Activity主窗口時 )。 | |
"stateAlwaysVisible"-----當用戶選擇這個 Activity時,軟鍵盤是可見的——也就是,也就是,當用戶肯定導航到該 Activity時,而不是返回到它因爲離開另外一個Activity。 | |
"adjustUnspecified"-----它不被指定是否該 Activity主 窗口調整大小以便留出軟鍵盤的空間,或是否窗口上的內容獲得屏幕上當前的焦點是可見的。系統將自動選擇這些模式中一種主要依賴因而否窗口的內容有任何佈局 視圖可以滾動他們的內容。若是有這樣的一個視圖,這個窗口將調整大小,這樣的假設可使滾動窗口的內容在一個較小的區域中可見的。這個是主窗口默認的行爲 設置。 | |
"adjustResize"-----該 Activity主窗口老是被調整屏幕的大小以便留出軟鍵盤的空間 | |
"adjustPan"-----該 Activity主窗口並不調整屏幕的大小以便留出軟鍵盤的空間。相反,當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能老是看到輸入內容的部分。這個一般是不指望比調整大小,由於用戶可能關閉軟鍵盤以便得到與被覆蓋內容的交互操做。 |
下面就是正題了。目前經手的項目有聊天界面,須要作成相似QQ聊天室當鍵盤顯示的時候表情欄隱藏,(因爲我的佈局問題致使各類鍵盤監聽事件都沒辦完全隱藏掉表情欄);思路以下,獲取鍵盤狀態是否顯示。顯示狀態,判斷表情有沒有顯示,若是顯示就隱藏,沒顯示就不作動做。鍵盤消失狀態,點擊表情按鈕,鍵盤消失表情顯示,spa
第一種房間比較簡單:code
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); if(imm.hideSoftInputFromWindow(editText.getWindowToken(), 0)) { imm.showSoftInput(editText,0); //軟鍵盤已彈出 } else { //軟鍵盤未彈出 }
可是這種在多佈局狀況fragment使用衆多的狀況好像很差使。
orm
在看第二種 須要本身去定義個佈局文件:server
package com.demo.softkeyboard; import com.demo.softkeyboard.KeyboardListenRelativeLayout.IOnKeyboardStateChangedListener; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; /** * 軟鍵盤監聽Demo * @author qiaoning * */ public class SoftKeyboardListenDemoActivity extends Activity { private EditText editText; KeyboardListenRelativeLayout relativeLayout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); relativeLayout = (KeyboardListenRelativeLayout) findViewById(R.id.keyboardRelativeLayout); editText = (EditText) findViewById(R.id.editText); relativeLayout.setOnKeyboardStateChangedListener(new IOnKeyboardStateChangedListener() { public void onKeyboardStateChanged(int state) { switch (state) { case KeyboardListenRelativeLayout.KEYBOARD_STATE_HIDE://軟鍵盤隱藏 editText.setVisibility(View.VISIBLE); break; case KeyboardListenRelativeLayout.KEYBOARD_STATE_SHOW://軟鍵盤顯示 editText.setVisibility(View.GONE); break; default: break; } } }); } }
用法xml
import com.demo.softkeyboard.KeyboardListenRelativeLayout.IOnKeyboardStateChangedListener; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; /** * 軟鍵盤監聽Demo * @author qiaoning * */ public class SoftKeyboardListenDemoActivity extends Activity { private EditText editText; KeyboardListenRelativeLayout relativeLayout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); relativeLayout = (KeyboardListenRelativeLayout) findViewById(R.id.keyboardRelativeLayout); editText = (EditText) findViewById(R.id.editText); relativeLayout.setOnKeyboardStateChangedListener(new IOnKeyboardStateChangedListener() { public void onKeyboardStateChanged(int state) { switch (state) { case KeyboardListenRelativeLayout.KEYBOARD_STATE_HIDE://軟鍵盤隱藏 editText.setVisibility(View.VISIBLE); break; case KeyboardListenRelativeLayout.KEYBOARD_STATE_SHOW://軟鍵盤顯示 editText.setVisibility(View.GONE); break; default: break; } } }); } }
最後佈局文件
<?xml version="1.0" encoding="utf-8"?> <com.demo.softkeyboard.KeyboardListenRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/keyboardRelativeLayout" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:fillViewport="true"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <EditText android:id="@+id/editText" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout> </ScrollView> </com.demo.softkeyboard.KeyboardListenRelativeLayout>
最後就是第三種方法,目前就是用這個種方式代替前面兩種:相對簡單
首先須要拿到Activity最外面的layout的佈局
final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); if (heightDiff > 100) { // 若是高度差超過100像素,就頗有多是有軟鍵盤... ... do something here } } });