Android 監(jiān)聽(tīng)鍵盤(pán)彈出收起

  很多項(xiàng)目都有登錄界面,而在登錄界面往往有個(gè)軟鍵盤(pán)彈起造成登錄界面布局的變型,這是用戶所不能容忍的,我是這樣做的,也成功解決了我的問(wèn)題!

在manifest文件中可以設(shè)置Activity的android:windowSoftInputMode屬性,這個(gè)屬性值常見(jiàn)的設(shè)置如下:
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
那么這里值的含義列表如下:
【A】stateUnspecified:軟鍵盤(pán)的狀態(tài)并沒(méi)有指定,系統(tǒng)將選擇一個(gè)合適的狀態(tài)或依賴于主題的設(shè)置
【B】stateUnchanged:當(dāng)這個(gè)activity出現(xiàn)時(shí),軟鍵盤(pán)將一直保持在上一個(gè)activity里的狀態(tài),無(wú)論是隱藏還是顯示
【C】stateHidden:用戶選擇activity時(shí),軟鍵盤(pán)總是被隱藏
【D】stateAlwaysHidden:當(dāng)該Activity主窗口獲取焦點(diǎn)時(shí),軟鍵盤(pán)也總是被隱藏的
【E】stateVisible:軟鍵盤(pán)通常是可見(jiàn)的
【F】stateAlwaysVisible:用戶選擇activity時(shí),軟鍵盤(pán)總是顯示的狀態(tài)
【G】adjustUnspecified:默認(rèn)設(shè)置,通常由系統(tǒng)自行決定是隱藏還是顯示
【H】adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤(pán)的空間
【 I 】adjustPan:當(dāng)前窗口的內(nèi)容將自動(dòng)移動(dòng)以便當(dāng)前焦點(diǎn)從不被鍵盤(pán)覆蓋和用戶能總是看到輸入內(nèi)容的部分

搜到的一些監(jiān)聽(tīng)鍵盤(pán)的方法必須要windowSoftInputMode屬性為adjustResize時(shí)才可以用。這個(gè)方法不適用與app全屏顯示(全屏?xí)r布局大小并不會(huì)改變)。有一個(gè)類可以實(shí)現(xiàn)監(jiān)聽(tīng)鍵盤(pán)彈出收起,不用考慮windowSoftInputMode屬性與Activity是否全屏。
softkeyboardlistener類:
http://download.csdn.net/download/l448288137/9211443

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;  //紀(jì)錄根視圖的顯示高度
private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;
public SoftKeyBoardListener(Activity activity) {
            //獲取activity的根視圖
            rootView = activity.getWindow().getDecorView();
            //監(jiān)聽(tīng)視圖樹(shù)中全局布局發(fā)生改變或者視圖樹(shù)中的某個(gè)視圖的可視狀態(tài)發(fā)生改變
 rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
          @Override
 public void onGlobalLayout() {
            //獲取當(dāng)前根視圖在屏幕上顯示的大小
              Rect r = new Rect();
              rootView.getWindowVisibleDisplayFrame(r);
              int visibleHeight = r.height();
              System.out.println(""+visibleHeight);
              if (rootViewVisibleHeight == 0) {
                      rootViewVisibleHeight = visibleHeight;
                      return;
              }
            //根視圖顯示高度沒(méi)有變化,可以看作軟鍵盤(pán)顯示/隱藏狀態(tài)沒(méi)有改變
              if (rootViewVisibleHeight == visibleHeight) {
                      return;
              }
            //根視圖顯示高度變小超過(guò)200,可以看作軟鍵盤(pán)顯示了
              if (rootViewVisibleHeight - visibleHeight > 200) {
                      if (onSoftKeyBoardChangeListener != null) {
                              onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);
                      }
                    rootViewVisibleHeight = visibleHeight;
                    return;
              }
            //根視圖顯示高度變大超過(guò)200,可以看作軟鍵盤(pán)隱藏了
              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中調(diào)用:

SoftKeyBoardListener.setListener(getActivity(), new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
@Override
public void keyBoardShow(int height) {
                //Toast.makeText(getActivity(), "鍵盤(pán)顯示 高度" + height, Toast.LENGTH_SHORT).show();
                  introl_iv.setBackground(null);  //使LOGO消失
     }
@Override
public void keyBoardHide(int height) {
              //Toast.makeText(getActivity(), "鍵盤(pán)隱藏 高度" + height, Toast.LENGTH_SHORT).show();
                introl_iv.setBackgroundResource(R.drawable.intro_logo);//設(shè)置
    }
});

這樣就可以監(jiān)聽(tīng)鍵盤(pán)的彈出收起操作了??梢栽趉eyBoardShow與keyBoardHide函數(shù)中寫(xiě)入對(duì)布局的操作。
下面是效果圖:

偉大的哲學(xué)家我自己曾經(jīng)說(shuō)過(guò),有夢(mèng)想就要大聲說(shuō)出來(lái) ,萬(wàn)丈高樓平地起,能不能行靠自己!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容