Android 監聽鍵盤彈出收起

小二陽發表於2017-12-14

很多專案都有登入介面,而在登入介面往往有個軟鍵盤彈起造成登入介面佈局的變型,這是使用者所不能容忍的,我是這樣做的,也成功解決了我的問題! 在manifest檔案中可以設定Activity的android:windowSoftInputMode屬性,這個屬性值常見的設定如下: android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

那麼這裡值的含義列表如下:

【A】stateUnspecified:軟鍵盤的狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設定

【B】stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裡的狀態,無論是 隱藏還是顯示

【C】stateHidden:使用者選擇activity時,軟鍵盤總是被隱藏

【D】stateAlwaysHidden:當該Activity主視窗獲取焦點時,軟鍵盤也總是被隱藏的

【E】stateVisible:軟鍵盤通常是可見的

【F】stateAlwaysVisible:使用者選擇activity時,軟鍵盤總是顯示的狀態

【G】adjustUnspecified:預設設定,通常由系統自行決定是隱藏還是顯示

【H】adjustResize:該Activity總是調整螢幕的大小以便留出軟鍵盤的空間

【I】adjustPan:當前視窗的內容將自動移動以便當前焦點從不被鍵盤覆蓋和使用者能總是看到輸入內容的部分

搜到的一些監聽鍵盤的方法必須要windowSoftInputMode屬性為adjustResize時才可以用。這個方法不適用與app全屏顯示(全屏時佈局大小並不會改變)。有一個類可以實現監聽鍵盤彈出收起,不用考慮windowSoftInputMode屬性與Activity是否全屏。

softkeyboardlistener類

importandroid.app.Activity;
importandroid.graphics.Rect;
importandroid.view.View;
importandroid.view.ViewTreeObserver;
importandroid.widget.Toast;/**
* Created by liujinhua on 15/10/25.
*/
public class SoftKeyBoardListener {
private View rootView;  //activity的根檢視
int rootViewVisibleHeight;  //紀錄根檢視的顯示高度
private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;
public SoftKeyBoardListener(Activity activity) {
            //獲取activity的根檢視
            rootView = activity.getWindow().getDecorView();
            //監聽檢視樹中全域性佈局發生改變或者檢視樹中的某個檢視的可視狀態發生改變
 rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
          @Override
 public void onGlobalLayout() {
            //獲取當前根檢視在螢幕上顯示的大小
              Rect r = new Rect();
              rootView.getWindowVisibleDisplayFrame(r);
              int visibleHeight = r.height();
              System.out.println(""+visibleHeight);
              if (rootViewVisibleHeight == 0) {
                      rootViewVisibleHeight = visibleHeight;
                      return;
              }
            //根檢視顯示高度沒有變化,可以看作軟鍵盤顯示/隱藏狀態沒有改變
              if (rootViewVisibleHeight == visibleHeight) {
                      return;
              }
            //根檢視顯示高度變小超過200,可以看作軟鍵盤顯示了
              if (rootViewVisibleHeight - visibleHeight > 200) {
                      if (onSoftKeyBoardChangeListener != null) {
                              onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);
                      }
                    rootViewVisibleHeight = visibleHeight;
                    return;
              }
            //根檢視顯示高度變大超過200,可以看作軟鍵盤隱藏了
              if (visibleHeight - rootViewVisibleHeight > 200) {
                            if (onSoftKeyBoardChangeListener != null) {
                                  onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);
                            }
                            rootViewVisibleHeight = visibleHeight;
                            return;
            }
      }
  });
}
private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
           this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;
}
public interface OnSoftKeyBoardChangeListener {
          void keyBoardShow(int height);
          void keyBoardHide(int height);
}
public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
        SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);
        softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);
}
}
複製程式碼

Activity中呼叫:

SoftKeyBoardListener.setListener(getActivity(), new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
@Override
public void keyBoardShow(int height) {
                //Toast.makeText(getActivity(), "鍵盤顯示 高度" + height, Toast.LENGTH_SHORT).show();
                  introl_iv.setBackground(null);  //使LOGO消失
     }
@Override
public void keyBoardHide(int height) {
              //Toast.makeText(getActivity(), "鍵盤隱藏 高度" + height, Toast.LENGTH_SHORT).show();
                introl_iv.setBackgroundResource(R.drawable.intro_logo);//設定
    }
});
複製程式碼

這樣就可以監聽鍵盤的彈出收起操作了。可以在keyBoardShow與keyBoardHide函式中寫入對佈局的操作。 下面是效果圖:

Android 監聽鍵盤彈出收起

Android 監聽鍵盤彈出收起

偉大的哲學家我自己曾經說過,有夢想就要大聲說出來 ,萬丈高樓平地起,能不能行靠自己!

相關文章