软键盘显示
1、WindowSoftInputMode九种状态(6+3)
(控制软键盘显示还是隐藏)
stateUnspecified:默认状态。不指定软键盘显示还是隐藏,将由系统选择合适的状态。
stateUnchanged:保留状态。当前界面的软键盘状态,取决于上一个界面的软键盘状态。
stateHidden:隐藏状态。向前导航到当前页面时隐藏软键盘。
stateVisible:显示软键盘。向前导航到当前页面时显示软键盘。上个页面返回时不显示。
stateAlwaysHidden:始终隐藏软键盘 。向前导航到当前页面时隐藏软键盘。
stateAlwaysVisible:始终显示软键盘 。向前导航到当前页面时显示软键盘。上个页面返回时也显示。
注:
stateVisible和stateAlwaysVisible的区别:
- A页面设置stateVisible,跳转到B页面,B中键盘仍然出现,返回至A时,A中键盘不出现
- A页面设置stateAlwaysVisible,跳转到B页面,B中键盘仍然出现,返回至A时,A中键盘还会出现
stateHidden和stateAlwaysHidden的区别:
- 应该是有区别的,只是实践过程中发现效果一致。
(软键盘弹起时状态)
adjustResize:调整 Activity 主窗口的尺寸,重绘,为屏幕上的软键盘腾出空间。
adjustPan:平移窗口内容,以在屏幕上显示焦点项,使用户能看到其输入的内容。
adjustUnspecified:系统根据窗口的内容是否存在任何可滚动其内容的布局视图,自动选择以上其中一种模式。一般,在无滑动的控件上,默认的指定形式为adjustPan,有滑动控件(比如ScrollView控件),则为adjustResize。
adjustNoting: 软键盘弹出时,主窗口不会做出任何反应。
2、设置WindowSoftInputMode的两种方式
(1)在AndroidManifest中设置activity属性android:windowSoftInputMode
(2)在activity的onCreate中代码设置
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)
键盘的调出和关闭
/**
* 调出键盘
* view为可见状态的EditText
**/
public static void showInput(Context context, View view) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(INPUT_METHOD_SERVICE);
if (imm != null) {
view.requestFocus();
imm.showSoftInput(view, 0);
}
}
/**
* 关闭软键盘
*/
public static void closeKeybord(View view, Context mContext) {
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
imeOptions与软键盘
日常开发中,有时需要控制软键盘enter键,以及横屏情况下的软键盘显示状态。这就需要用到EditText的imeOptions属性
(1)控制软键盘enter键
- android:imeOptions=”normal”或android:imeOptions=”actionUnspecified”,默认状态,由系统决定enter键行为(若后面还有输入控件,显示下一项,若无,显示完成)
- android:imeOptions=”actionNone” 若后面还有输入控件,显示下一项,若无,点击后关闭软键盘
- android:imeOptions=”actionGo” enter键显示为“前往”,需要自己写事件
- android:imeOptions=”actionSearch“ enter键显示为“搜索”,需要自己写事件
- android:imeOptions=”actionSend” enter键显示为“发送”,需要自己写事件
- android:imeOptions=”actionNext” enter键显示为“下一项”
- android:imeOptions=”actionPrevious” enter键显示为“上一项”
- android:imeOptions=”actionDone” enter键显示为“完成”
以上设置需同时设置android:singleLine=”true”才能起效。若不设或为false,点击会换行。
若以上设置,enter键按钮无发生变化,则需要设置android:inputType=“text”,原因可见 ->
软键盘enter事件监听
mMainEt = (EditText) findViewById(R.id.edit);
mMainEt.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
switch (actionId) {
//点击GO键
case EditorInfo.IME_ACTION_GO:
return true;
//点击Done
case EditorInfo.IME_ACTION_DONE:
return true;
//点击Next
case EditorInfo.IME_ACTION_NEXT:
return true;
//点击Previous
case EditorInfo.IME_ACTION_PREVIOUS:
return true;
//点击None
case EditorInfo.IME_ACTION_NONE:
return true;
//点击Send
case EditorInfo.IME_ACTION_SEND:
return true;
}
return false;
}
});
(2)控制横屏下的软键盘显示状态
android:imeOptions=”flagNoFullscreen|flagNoExtractUi” 软键盘以半屏状态显示
android:imeOptions=”flagNoAccessoryAction” 软键盘全屏显示,输入框右侧无按钮
android:imeOptions=”flagNavigatePrevious”或android:imeOptions=”flagNavigateNext”
或android:imeOptions=”flagNoEnterAction” 软键盘全屏显示,如后面仍有输入框,右侧按钮显示下一步,若无,显示完成
判断键盘是否弹出
private val layoutListener = ViewTreeObserver.OnGlobalLayoutListener {
if (isKeyboardShown(parent_view)) {//键盘弹出
}
}
private fun isKeyboardShown(rootView: View): Boolean {
val softKeyboardHeight = 100
val r = Rect()
rootView.getWindowVisibleDisplayFrame(r)
val dm = rootView.resources.displayMetrics
val heightDiff = rootView.bottom - r.bottom
if (heightDiff > 0) {
layout_input.visibility = if (showingFeedbackDialog) View.GONE else View.VISIBLE
val param = layout_input.layoutParams
param.height = dm.heightPixels - heightDiff
layout_input.layoutParams = param
text_input.requestFocus()
}
return heightDiff > softKeyboardHeight * dm.density
}