原因是因为当界面初始化的时候可能EditText并没有初始化完成,就要求显示软键盘了。
成都创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的乐山网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
在包含EditText外层布局上添加,抢在EditText获取焦点,即可。
正常情况下,只要写了EditText控件,当进入Activity时,是会直接显示软键盘的,但是如果我们的EditText是GONE或者INVISIBLE的话,当我们点击其他控件,然后让Edittext显示,并且弹出软键盘,那么这个时候就必须关注顺序的问题,必须必须先让EditText显示,在调用显示软键盘的代码才可以,如果先让软键盘弹出再让EditText显示,这个时候软键盘是弹不出来的。
1、首先,在xml文件中通过让edittext获取焦点
EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="17dp"
android:textColor="#333333"
android:textColorHint="#999999"
android:hint="请输入课件描述..."
android:gravity="top|left"
android:background="@null"
requestFocus/
/EditText
2、在清单文件中给activity添加android:windowSoftInputMode=”stateVisible”属性,这样一进入这个页面的时候光标就自动显示,软键盘也显示出来
activity
android:name=".wonderfulmoment.AddCourseWareDescriptionActivity"
android:windowSoftInputMode="stateVisible"/activity
一、效果图:
二、Code:
/**
* 1、获取main在窗体的可视区域
* 2、获取main在窗体的不可视区域高度
* 3、判断不可视区域高度,之前根据经验值,在有些手机上有点不大准,现改成屏幕整体高度的1/3
* 1、大于屏幕整体高度的1/3:键盘显示 获取Scroll的窗体坐标
* 算出main需要滚动的高度,使scroll显示。
* 2、小于屏幕整体高度的1/3:键盘隐藏
*
* @param main 根布局
* @param scroll 需要显示的最下方View
*/
public static void addLayoutListener(final View main, final View scroll) {
main.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
main.getWindowVisibleDisplayFrame(rect);
int screenHeight = main.getRootView().getHeight();
int mainInvisibleHeight = main.getRootView().getHeight() - rect.bottom;
if (mainInvisibleHeight screenHeight / 4) {
int[] location = new int[2];
scroll.getLocationInWindow(location);
int srollHeight = (location[1] + scroll.getHeight()) - rect.bottom;
main.scrollTo(0, srollHeight);
} else {
main.scrollTo(0, 0);
}
}
});
}
三、调用方式:
在Activity的onCreate()中调用,
仅此记录。
这个问题看似简单,不过由于Android输入法的开放性,许多输入法相关的参数设置是由第三方输入法来实现的,而第三方输入法众多、实现不一,导致这个问题变得很复杂。
结论是,目前来看,并没有直接的方法,可以对所有输入法实现上述需求。
不过针对这个问题,我们有以下几种处理方案:
设置android:digits属性,允许输入数字和字母。
设置android:inputType为"number",将键盘切换为数字键盘。
这里的关键是,虽然单独设置android:inputType="number"时,只允许输入数字;但同时设置android:inputType和android:digits时,允许输入的字符是以android:digits为准的。
当输入法本身的UI允许在数字键盘、字母键盘间切换时,该方案是有效的;但是一些输入法的数字键盘不能切换到字母键盘,该方案失效;特别是,Android5.0的原生输入法就是如此,数字键盘UI没有提供切换到其他键盘的按钮。
虽然该方案对一些输入法(尤其是英文输入法)无效,但是中文输入法基本都是有效的。如果APP仅在国内用的,这个方案够用了
方案一失效的主要原因是,输入法界面中没有提供切换键盘的按键,所以我们可以自己添上按键。
带来的问题是,自己添加按键,很难与输入法保持统一的UI风格;而当输入法本身有键盘切换按键时,这个方案是画蛇添足,既怪异又不美观。 所以这个方案在UI上有严重缺陷,并不实用。
效果图如下:
Activity如下:
activity_main.xml如下:
自定义键盘可以彻底解决问题,是最完美的方案;但是复杂度有点高。
默认弹出数字键盘真的有那么重要么?没有的话,干脆不要折腾了,StackOverflow上那么多人已经证明这个问题无完美解了。
可以通过下面的代码来实现Android自动弹出软键盘:
edittext.requestFocus(); //edittext是一个EditText控件
Timer timer = new Timer(); //设置定时器
timer.schedule(new TimerTask() {
@Override
public void run() { //弹出软键盘的代码
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edittext, InputMethodManager.RESULT_SHOWN);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);
}
}, 300); //设置300毫秒的时长
说明:同样是在写Techo Lite时遇到的问题。希望程序可以自动弹出软键盘,可是尝试了各种办法都没有效果。问题的原因似乎是必须等待UI绘制完成后弹出软键盘的代码才会有效。于是就采用了上面的方法。需要注意的是,在此之前必须让edittext获取焦点,不然也是无效的。