android:windowSoftInputMode说明:
stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
stateHidden:用户选择activity时,软键盘总是被隐藏
stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
stateVisible:软键盘通常是可见的
stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
主要两个
adjustPan:浮在屏幕 覆盖输入框会移动屏幕露出输入框(整体移动,造成界面显示问题)
adjustResize:挤占界面 1、界面自身可以滚动不会移动屏幕(界面尺寸变化,有输入框可以滚动),2,界面不可滚动会移动屏幕露出输入框。
adjustNothing: 没变化
软键盘弹出对View变化
DecorView 不会变化
R.id.content 会影响
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 :不会执行该监听
Log.v("Keyboard","mainView = "+ mainView + " mainView.getRootView() = " + mainView.getRootView());
}
}
});
flutter影响
adjustPan 软键盘浮在屏幕,屏幕不会移动,会覆盖输入框
adjustResize:软键盘挤占界面,输入框会被顶上去(可以通过监听界面变化来监听是否弹出软键盘)
flutter 弹出软键盘,setState()刷新界面,软键盘又关闭的bug(界面结构改变)。
例如:
getBottomPanel(){
if(showBottomExtendPanel){//showBottomExtendPanel
return Column(
children: <Widget>[
_getBottomSimple(),//TextField
Container(
height: keyboardHeight + 64,
child: Center(child: GestureDetector(onTap: (){
_sendSugarBot();},child: Text('我的扩展板',style: TextStyle(color: Colors.black),),),),
)
],
);
}else{
return Column(
children: <Widget>[
_getBottomSimple(),//这种成功,是TextField树结构没有变,没有创建新的Element,而是使用原来的Element
Container(),
],
);
/////return _getBottomSimple();TextField 这种就会导致键盘取消,猜测原因是showBottomExtendPanel状态改变,由上面个Colume->TextField结构变成只有TextField结构,导致重新创建TextField,焦点失去
}
}