1. 程式人生 > >檢測軟鍵盤的彈起與隱藏【絕對經典,好用】

檢測軟鍵盤的彈起與隱藏【絕對經典,好用】

今天看到社群裡面有人問關於如何檢測軟鍵盤的彈起和隱藏事件。正確處理好軟鍵盤的彈起和隱藏可以大大提升應用的體驗。這一點,“切客優惠”做的很好。


device-2012-02-23-231400.png 
device-2012-02-23-231422.png 
在軟鍵盤彈起後,下面的分享內容自動隱藏,並且在titlebar上,顯示簽到按鈕。這個是一個非常貼心的設計,使用者體檢大大提升。
這是被大家視為無解的難題,我給大家提供一種方法。

有圖為證:
device-2012-02-23-223840.png 
初始化頁面
device-2012-02-23-223901.png 
刀客優化版初始頁
device-2012-02-23-225120.png 
優化版鍵盤彈起
device-2012-02-23-223957.png 

軟鍵盤隱藏
device-2012-02-23-224010.png 
嘿嘿,未優化版的釘子戶
device-2012-02-23-224022.png 
釘子戶果然堅挺啊
下面談談偶的實現原理:
使用自定義佈局,頁面佈局中包含ScrollVIew,在軟鍵盤彈起後,佈局的高度會發生改變,根據佈局的高度來判斷軟鍵盤的狀態。
  1. package com.ransj.keyboard;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.util.Log;
  5. import android.widget.RelativeLayout;
  6. public class KeyboardLayout extends RelativeLayout {
  7. private static final String TAG = KeyboardLayout.class.getSimpleName();
  8. public static final byte KEYBOARD_STATE_SHOW = -3;
  9. public static final byte KEYBOARD_STATE_HIDE = -2;
  10. public static final byte KEYBOARD_STATE_INIT = -1;
  11. private boolean mHasInit;
  12. private boolean mHasKeybord;
  13. private int mHeight;
  14. private onKybdsChangeListener mListener;
  15. public KeyboardLayout(Context context, AttributeSet attrs, int defStyle) {
  16. super(context, attrs, defStyle);
  17. }
  18. public KeyboardLayout(Context context, AttributeSet attrs) {
  19. super(context, attrs);
  20. }
  21. public KeyboardLayout(Context context) {
  22. super(context);
  23. }
  24. /**
  25. * set keyboard state listener
  26. */
  27. public void setOnkbdStateListener(onKybdsChangeListener listener){
  28. mListener = listener;
  29. }
  30. @Override
  31. protected void onLayout(boolean changed, int l, int t, int r, int b) {
  32. super.onLayout(changed, l, t, r, b);
  33. if (!mHasInit) {
  34. mHasInit = true;
  35. mHeight = b;
  36. if (mListener != null) {
  37. mListener.onKeyBoardStateChange(KEYBOARD_STATE_INIT);
  38. }
  39. } else {
  40. mHeight = mHeight < b ? b : mHeight;
  41. }
  42. if (mHasInit && mHeight > b) {
  43. mHasKeybord = true;
  44. if (mListener != null) {
  45. mListener.onKeyBoardStateChange(KEYBOARD_STATE_SHOW);
  46. }
  47. Log.w(TAG, "show keyboard.......");
  48. }
  49. if (mHasInit && mHasKeybord && mHeight == b) {
  50. mHasKeybord = false;
  51. if (mListener != null) {
  52. mListener.onKeyBoardStateChange(KEYBOARD_STATE_HIDE);
  53. }
  54. Log.w(TAG, "hide keyboard.......");
  55. }
  56. }
  57. public interface onKybdsChangeListener{
  58. public void onKeyBoardStateChange(int state);
  59. }
  60. }
複製程式碼 這個是自定義的佈局,自定義佈局可以繼承各種常見佈局。自定義佈局有鍵盤狀態改變監聽器,可以通過註冊監聽器來監聽軟鍵盤狀態。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <com.ransj.keyboard.KeyboardLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:id="@+id/keyboardLayout1"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent" >
  6.     <ScrollView
  7.         android:layout_width="fill_parent"
  8.         android:layout_height="fill_parent"
  9.         android:layout_alignParentLeft="true"
  10.         android:layout_alignParentTop="true"
  11.         android:fillViewport="true" >
  12.         <LinearLayout
  13.             android:layout_width="fill_parent"
  14.             android:layout_height="wrap_content"
  15.             android:orientation="vertical" >
  16.             <TextView
  17.                 android:id="@+id/testone_tv"
  18.                 android:layout_width="fill_parent"
  19.                 android:layout_height="wrap_content"
  20.                 android:background="#000000"
  21.                 android:gravity="center"
  22.                 android:text="軟體盤彈起,我將消失!軟鍵盤隱藏,我將回來!"
  23.                 android:layout_weight="1.0"
  24.                 android:textColor="#00ff00"
  25.                 android:textStyle="bold" />
  26.             <EditText
  27.                 android:id="@+id/testone_et"
  28.                 android:layout_width="fill_parent"
  29.                 android:layout_height="wrap_content"></EditText>
  30.         </LinearLayout>
  31.     </ScrollView>
  32. </com.ransj.keyboard.KeyboardLayout>
複製程式碼 這個是優化頁面的佈局,從上面可以看出自定義佈局的用法。
  1. package com.ransj.keyboard;
  2. import com.ransj.keyboard.KeyboardLayout.onKybdsChangeListener;
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.TextView;
  7. import android.widget.Toast;
  8. /**

  9. *
  10. */
  11. public class TestOne extends Activity{
  12.         @Override
  13.         protected void onCreate(Bundle savedInstanceState) {
  14.                 super.onCreate(savedInstanceState);
  15.                 setContentView(R.layout.testone);
  16.                 KeyboardLayout mainView = (KeyboardLayout) findViewById(R.id.keyboardLayout1);
  17.                 final TextView tv = (TextView) findViewById(R.id.testone_tv);
  18.                 mainView.setOnkbdStateListener(new onKybdsChangeListener() {
  19.                         public void onKeyBoardStateChange(int state) {
  20.                                 switch (state) {
  21.                                 case KeyboardLayout.KEYBOARD_STATE_HIDE:
  22.                                         tv.setVisibility(View.VISIBLE);
  23.                                         Toast.makeText(getApplicationContext(), "軟鍵盤隱藏", Toast.LENGTH_SHORT).show();
  24.                                         break;
  25.                                 case KeyboardLayout.KEYBOARD_STATE_SHOW:
  26.                                         tv.setVisibility(View.INVISIBLE);
  27.                                         Toast.makeText(getApplicationContext(), "軟鍵盤彈起", Toast.LENGTH_SHORT).show();
  28.                                         break;
  29.                                 }
  30.                         }
  31.                 });
  32.         }
  33.         @Override
  34.         protected void onDestroy() {
  35.                 super.onDestroy();
  36.         }
  37.         @Override
  38.         protected void onPause() {
  39.                 super.onPause();
  40.         }
  41. }
複製程式碼 這個是優化頁面的程式碼邏輯,通過註冊監聽器,來監聽軟鍵盤事件。在軟鍵盤彈起時隱藏Textview,在軟鍵盤隱藏時顯示Textview。