android:windowSoftInputMode說明:
stateUnspecified:軟鍵盤的狀態(tài)并沒有指定,系統(tǒng)將選擇一個(gè)合適的狀態(tài)或依賴于主題的設(shè)置
stateUnchanged:當(dāng)這個(gè)activity出現(xiàn)時(shí),軟鍵盤將一直保持在上一個(gè)activity里的狀態(tài),無論是隱藏還是顯示
stateHidden:用戶選擇activity時(shí),軟鍵盤總是被隱藏
stateAlwaysHidden:當(dāng)該Activity主窗口獲取焦點(diǎn)時(shí),軟鍵盤也總是被隱藏的
stateVisible:軟鍵盤通常是可見的
stateAlwaysVisible:用戶選擇activity時(shí),軟鍵盤總是顯示的狀態(tài)
adjustUnspecified:默認(rèn)設(shè)置,通常由系統(tǒng)自行決定是隱藏還是顯示
adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤的空間
adjustPan:當(dāng)前窗口的內(nèi)容將自動(dòng)移動(dòng)以便當(dāng)前焦點(diǎn)從不被鍵盤覆蓋和用戶能總是看到輸入內(nèi)容的部分
主要兩個(gè)
adjustPan:浮在屏幕 覆蓋輸入框會(huì)移動(dòng)屏幕露出輸入框(整體移動(dòng),造成界面顯示問題)
adjustResize:擠占界面 1、界面自身可以滾動(dòng)不會(huì)移動(dòng)屏幕(界面尺寸變化,有輸入框可以滾動(dòng)),2,界面不可滾動(dòng)會(huì)移動(dòng)屏幕露出輸入框。
adjustNothing: 沒變化
軟鍵盤彈出對View變化
DecorView 不會(huì)變化
R.id.content 會(huì)影響
mainView = ((ViewGroup)findViewById(android.R.id.content)).getChildAt(0);
mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
if (mainView != null) {
mainView.getWindowVisibleDisplayFrame(r);//獲取可見
// check if the visible part of the screen is less than 85%
// if it is then the keyboard is showing
boolean newState = ((double)r.height() / (double)mainView.getRootView().getHeight()) < 0.85;
Log.v("Keyboard","r.height() = "+ r.height() + "mainView.getHeight() " + mainView.getHeight() +" "+ findViewById(android.R.id.content).getHeight()+" mainView.getRootView().getHeight()) = " + mainView.getRootView().getHeight());
//adjustPan :V/Keyboard: r.height() = 1051mainView.getHeight() 897 897 mainView.getRootView().getHeight()) = 1920
//adjustResize :V/Keyboard: r.height() = 1051mainView.getHeight() 1700 1700 mainView.getRootView().getHeight()) = 1920
//adjustUnspecified:V/Keyboard: r.height() = 1051mainView.getHeight() 897 897 mainView.getRootView().getHeight()) = 1920
//adjustNothing :不會(huì)執(zhí)行該監(jiān)聽
Log.v("Keyboard","mainView = "+ mainView + " mainView.getRootView() = " + mainView.getRootView());
}
}
});
flutter影響
adjustPan 軟鍵盤浮在屏幕,屏幕不會(huì)移動(dòng),會(huì)覆蓋輸入框
adjustResize:軟鍵盤擠占界面,輸入框會(huì)被頂上去(可以通過監(jiān)聽界面變化來監(jiān)聽是否彈出軟鍵盤)
flutter 彈出軟鍵盤,setState()刷新界面,軟鍵盤又關(guān)閉的bug(界面結(jié)構(gòu)改變)。
例如:
getBottomPanel(){
if(showBottomExtendPanel){//showBottomExtendPanel
return Column(
children: <Widget>[
_getBottomSimple(),//TextField
Container(
height: keyboardHeight + 64,
child: Center(child: GestureDetector(onTap: (){
_sendSugarBot();},child: Text('我的擴(kuò)展板',style: TextStyle(color: Colors.black),),),),
)
],
);
}else{
return Column(
children: <Widget>[
_getBottomSimple(),//這種成功,是TextField樹結(jié)構(gòu)沒有變,沒有創(chuàng)建新的Element,而是使用原來的Element
Container(),
],
);
/////return _getBottomSimple();TextField 這種就會(huì)導(dǎo)致鍵盤取消,猜測原因是showBottomExtendPanel狀態(tài)改變,由上面?zhèn)€Colume->TextField結(jié)構(gòu)變成只有TextField結(jié)構(gòu),導(dǎo)致重新創(chuàng)建TextField,焦點(diǎn)失去
}
}