一.android:windowSoftInputMode属性详解
activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。
这个属性能影响两件事情:
【一】当有焦点产生时,软键盘是隐藏还是显示
【二】是否减少活动主窗口大小以便腾出空间放软键盘
它的设置必须是下面列表中的一个值,或一个”state…”值加一个”adjust…”值的组合。在任一组设置多个值——多个”state…”values,例如&mdash有未定义的结果。各个值之间用|分开。例如:<activity android:windowSoftInputMode="stateVisible|adjustResize". . . >
在这设置的值(除"stateUnspecified"和"adjustUnspecified"以外)将覆盖在主题中设置的值
各值的含义:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
在Manifest文件对应的Activity设置
android:windowSoftInputMode="adjustPan|stateHidden"
<activity android:name=".LoginActivity" android:windowSoftInputMode="adjustPan|stateHidden"/>
二.android:focusable和android:focusableInTouchMode的区别
前者针对在键盘下操作的情况,如果设置为true,则键盘上下左右选中,焦点会随之移动。
而后者,显然是针对触屏情况下的,也就是我们点击屏幕的上的某个控件时,不要立即执行相应的点击逻辑,而是先显示焦点(即控件被选中),再点击才执行逻辑。
android:focusable=“true”不会改变android:focusableInTouchMode,因此只在键盘状态下显示焦点,在TouchMode状态下,依旧无法显示焦点。
android:focusable=“false”,一定会使android:focusableInTouchMode=“false”。
相对的
android:focusableInTouchMode=“false”,不会影响android:focusable=“false”。
android:focusableInTouchMode=”true”,一定会是android:focusable=“true”
说来说去有点绕。
但请记住一点,就是对于现在触屏时代的手机而言,如果要获取焦点,我们只需要设置
android:foucusableInTouchMode=“true”就可以了。
所有的获取焦点,都要有一个前提,那就是该控件必须设置android:clickable=”true”,如果都点击不了,设置焦点应该没什么意义了吧。
三.让EditText获取和失去焦点
/*让用户名EditText获取焦点*/
phone.setFocusable(true);
phone.setFocusableInTouchMode(true);
phone.requestFocus();
/*让用户名EditText失去焦点*/
phone.clearFocus();
phone.setFocusable(false);
四.强制显示和隐藏软键盘
/**
* 弹出软键盘
*/
public void showKeyBoard(View v) {
InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
if (null != imm) {
v.requestFocus();
imm.showSoftInput(v, 0);
}
isKeyboardShow = true;
}
/**
* 隐藏软键盘
*/
public void hideKeyBoard(View v) {
InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
if (null != imm) {
v.requestFocus();
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
isKeyboardShow = false;
}