很多項(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)丈高樓平地起,能不能行靠自己!