最近接触到PDA设备相关的业务,应用场景如下:
1.PDA机器是通过扫描接收参数
2.需要输入框获取到焦点,才能接收参数
3.输入框聚焦,但键盘弹出遮挡屏幕
4.默认输入框聚焦,但不要弹出软键盘,由按钮控制显示隐藏
开始代码工作
start-------------------------------------------------------------------------
import android.app.Activity;
import android.graphics.Rect;
import android.os.Build;
import android.text.InputType;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import java.lang.reflect.Method;
/**
* 软件键盘管理
* 如果需要按钮控制键盘显示或隐藏状态,前提条件必须要有焦点,不然则无效
*/
public class SoftKeyboardUtils {
/**
* 键盘状态
*
* @param activity
* @return true显示 false隐藏
*/
public static boolean getSoftKeyboardStatus(Activity activity) {
//获取当前屏幕内容的高度
int screenHeight = activity.getWindow().getDecorView().getHeight();
//获取View可见区域的bottom
Rect rect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
return screenHeight - rect.bottom != 0;
}
/**
* 根据键盘状态显示或隐藏键盘
*
* @param activity
*/
public static void showOrHideSoftKeyboard(Activity activity) {
if (getSoftKeyboardStatus(activity)) {
hideKeyboard(activity);
} else {
showSoftKeyboard(activity);
}
}
/**
* 软键盘显示
*
* @param activity
*/
public static void showSoftKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
View view = activity.getCurrentFocus();
if (view == null) {
view = new View(activity);
}
imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
}
/**
* 软键盘隐藏
*/
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
View view = activity.getCurrentFocus();
if (view == null) {
view = new View(activity);
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
/**
* edit获取焦点但不显示软键盘
*
* @param editText
*/
public static void disableShowInput(EditText editText) {
if (Build.VERSION.SDK_INT <= 10) {
editText.setInputType(InputType.TYPE_NULL);
} else {
Class<EditText> cls = EditText.class;
Method method;
try {
method = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
method.setAccessible(true);
method.invoke(editText, false);
} catch (Exception e) {//TODO: handle exception
}
}
}
}
以上是全部代码实现
补充说明:
如果要控制软键盘显示的前提条件是,必须先获取到焦点。
可以看官方源码
我们只需要看这段就可以,可以看到有两个参数,我们只看view参数,
view The currently focused view, which would like to receive
大概意思是说,视图已经获取到了聚焦,我需要从这里打开软键盘。所以这里打开软键盘这个动作,是建立在这个view视图已聚焦的基础之上的。
所以如果你未获取到焦点,是不可能打开软键盘的。
end--------------------------------------------------------------------------
本人菜鸟一枚,不足之处,还望指点