开发记录,使用虚拟键盘常用的一些小技巧,开发中遇到一些坑。
前言:EditText控件 和 虚拟键盘在开发中时常使用到,在一些特殊场景EditText的使用并不像我们所想的那么顺心,今天开发中就遇到一些问题,一般问题百度均可解决,但是很耽搁时间。所以就把所需使用到小技巧记录下来,以便之后使用。
问题一:虚拟键盘 手动开启,关闭。
问题二:键盘顶起底部控件;
问题二:popupwindow内输入框遮挡问题;
1、虚拟键盘弹出与隐藏;
Android中软键盘的管理主要是通过InputMethodManager类来完成的。
InputMethodManager对象的获取方法如下
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
手动弹出:
mEditText. requestFocus();
if (null!=inputManager){
inputManager.showSoftInput(mEditText, InputMethodManager.SHOW_FORCED);
}
AIP详解:
第一个参数 中view必须是EditText,或者EditText的子类,如果是其他类型的View,如Button,TextView等,showSoftInput()方法不起作用。并且 第一个参数中view 必须已经获取到焦点(即 view.isFocused() 返回true),如果当前焦点不在该view上,则方法showSoftInput()不起作用,虽然EditText默认是可以获取焦点的,但是由于一个布局可能会有多个控件可以获取焦点,焦点位置不一定恰好在你控制的 EditText上,所以 之前可以调用 view.requestFocus();获取焦点
踩坑: showSoftInPut() 方法必须在布局加载完毕之后才能生效。所以如果你在onCreatView() 中直接调用,可能会不起作用;
解决: 如果你想在进入界面,虚拟键马上显示,可以在清单文件 为此Activity生命 属性:android:windowSoftInputMode
手动关闭:
if (null!= inputManager){
inputManager.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
}
AIP详解:
第一个参数是一个 IBinder ,可以直接传递一个 View.getWindowToken()
的 windowToken 对象就可以了。而第二个参数,就是隐藏软键盘的标志位,如果没有特殊要求的话,直接传递 0 就好了。
注意:这里虽然原则上需要传递一个之前弹出键盘传递的时候,传递的 View 的 windowToken ,但是实际情况是你只需要传递一个存在于当前布局 ViewTree 中,随意一个 View 的 windowToken 就可以了。
2、键盘顶起底部控件;
方法一:在清单文件 声明Activity节点中加入属性 <activity android:windowSoftInputMode="ajustResize" ... >
方法二: android:windowSoftInputMode="stateUnchanged|adjustPan"
踩坑: 这样启用键盘,会紧挨着Editext控件底部。
解决:不在清单文件设置任何属性,而是是 布局文件XML中想办法
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background"
android:id="@+id/rv_root"
>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<...>
</LinearLayout>
</ScrollView>
<include
android:id="@+id/view_pay"
android:visibility="gone"
layout="@layout/dialog_pay"/>
</RelativeLayout>
使用相对布局,整个屏幕显示内容使用ScrollView 嵌套, 底部需被键盘顶起空间放在外侧:
解决方法二:
/**
* @param root 最外层布局,需要调整的布局
* @param scrollToView 被键盘遮挡的scrollToView,滚动root,使scrollToView在root可视区域的底部
*/
private void controlKeyboardLayout(final View root, final View scrollToView) {
root.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
//获取root在窗体的可视区域
root.getWindowVisibleDisplayFrame(rect);
//获取root在窗体的不可视区域高度(被其他View遮挡的区域高度)
int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;
//若不可视区域高度大于100,则键盘显示
if (rootInvisibleHeight > 100) {
int[] location = new int[2];
//获取scrollToView在窗体的坐标
scrollToView.getLocationInWindow(location);
//计算root滚动高度,使scrollToView在可见区域的底部
int srollHeight = (location[1] + scrollToView.getHeight()) - rect.bottom;
root.scrollTo(0, srollHeight);
} else {
//键盘隐藏
root.scrollTo(0, 0);
}
}
});
使用解决方法二采坑: 整体布局上移,目的(外部 view不上移,底部推上) 目前采用 方法一,方法二 先留个坑吧开发任务太紧。抓紧赶进度中。
扩展:
【1】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【2】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【3】stateHidden:用户选择activity时,软键盘总是被隐藏
【4】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【5】stateVisible:软键盘通常是可见的
【6】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【7】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【8】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【9】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
3、popupwindow内输入框遮挡问题;
popupwindow.setSoftInputMode(PopupWindow.INPUT_METHOD_NEEDED);popupwindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
PS:少说多听,问题,解决是财富。回避是隐患。