推荐阅读:
android全屏/沉浸式状态栏下,各种键盘挡住输入框解决办法
Android仿微信朋友圈评论功能
class EditText extends TextView
在开发的过程中,通常会用到EditText,如何让虚拟键盘来适应输入框中内容的类型,通常我们都会在xml文件中加入android:inputType=”“。
android:inputType="none"
android:inputType="text"
android:inputType="textCapCharacters"//前3个输入普通字符
android:inputType="textCapWords"//单词首字母大小
android:inputType="textCapSentences"//仅第一个字母大小
android:inputType="textAutoCorrect"android:inputType="textAutoComplete"//前两个自动完成
android:inputType="textMultiLine"//多行输入
android:inputType="textImeMultiLine"//输入法多行(不一定支持)
android:inputType="textNoSuggestions"//不提示
android:inputType="textUri"//URI格式
android:inputType="textEmailAddress"//电子邮件地址格式
android:inputType="textEmailSubject"//邮件主题格式
android:inputType="textShortMessage"//短消息格式
android:inputType="textLongMessage"android:inputType="textPersonName"//人名格式
android:inputType="textPostalAddress"//邮政格式
android:inputType="textPassword"//密码格式
android:inputType="textVisiblePassword"//密码可见格式
android:inputType="textWebEditText"//作为网页表单的文本格式
android:inputType="textFilter"//文本筛选格式
android:inputType="textPhonetic"//拼音输入格式
android:inputType="number"//数字格式
android:inputType="numberSigned"//有符号数字格式
android:inputType="numberDecimal"//可以带小数点的浮点格式
android:inputType="phone"//拨号键盘
android:inputType="datetime"android:inputType="date"//日期键盘
android:inputType="time"//时间键盘
在开发过程中,我们经常会遇到Activity中包含EditText控件时会自动弹出虚拟键盘的情况,这是由于EditText自动获得焦点的缘故,只要让EditText失去焦点就行了,解决办法如下:
android:windowSoftInputMode="stateHidden"
EditText edt = (EditText)findViewById(R.id.edt);
edt.clearFocus();
EditText edt = (EditText)findViewById(R.id.edt);
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edt.getWindowToken(), 0);
EditText edt = (EditText)findViewById(R.id.edt);
edt.setInputType(InputType.TYPE_NULL);
但有时我们确实是想让EditText自动获得焦点并弹出软键盘,在设置了EditText自动获得焦点后,软件盘不会弹出。
注意:此时是由于刚跳到一个新的界面,界面未加载完全而无法弹出软键盘。此时应该适当的延迟弹出软键盘,如500毫秒(保证界面的数据加载完成,如果500毫秒仍未弹出,则延长至1000毫秒)。
1、可以在EditText后面加上一段代码:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
InputMethodManager inputManager = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(editText, 0);
}
}, 500);
2、给activity配置加入属性:
android:windowSoftInputMode="adjustResize"
(1)EditText有焦点(focusable为true)阻止输入法弹出
editText=(EditText)findViewById(R.id.txtBody);
editText.setOnTouchListener(new OnTouchListener(){
public boolean onTouch(View v, MotionEvent event){
editText.setInputType(InputType.TYPE_NULL); //关闭软键盘
return false;
}
});
(2)当EidtText无焦点(focusable=false)时阻止输入法弹出
InputMethodManager imm =
(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(),0);
(3)调用数字键盘并设置输入类型和键盘为英文
etNumber.setInputType(InputType.TYPE_CLASS_NUMBER); //调用数字键盘
rlEditText.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
//设置输入类型和键盘为英文
android:inputType="textUri|textMultiLine"
(4)
android:focusable="false"//键盘永远不会弹出
android:name=".AddLinkman"
android:windowSoftInputMode="adjustUnspecified|stateHidden"/>//不自动弹出键盘
//关闭键盘(比如输入结束后执行)
InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(etEditText.getWindowToken(), 0);
//自动弹出键盘
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);
etEditText.requestFocus();//让EditText获得焦点,但是获得焦点并不会自动弹出键盘
有时候也要对intent的默认焦点进行设置,不至于在intent跳转的时候默认焦点(光标)在EditText上,导致进入intent就打开输入法,影响界面美观。
默认焦点的顺序是:从上到下、从左到右第一个可以输入的控件作为焦点。
可以让别的控件获取焦点:
button.setFocusable(true);
button.requestFocus();
button.setFocusableInTouchMode(true);
也可以:
在EditText前面放置一个看不到的或Editview的父布局LinearLayout,让他率先获取焦点:
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
XML文件中:
Android:password="true" // 以”.”形式显示密码文本
android:inputType=”textPassword” //不可见密码
android:inputType=”textVisiblePassword”//可见密码
Java代码中
et.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
et.setTransformationMethod(PasswordTransformationMethod.getInstance());
例子如下:
//密码是否隐藏
imgviewForgetPwEye.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v) {
if (isshow) {
//设置密码为隐藏的
editForgetPwUserPasswd.setTransformationMethod(PasswordTransformationMethod.getInstance());
isshow = false;
} else {
//设置EditText的密码为可见的
editForgetPwUserPasswd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
isshow = true;
}
}
});
android:hint="请输入数字!"//设置显示在空间上的提示信息
android:numeric="integer"//设置只能输入整数,如果是小数则是:decimal
android:singleLine="true"//设置单行输入,一旦设置为true,则文字不会自动换行。
android:password="true"//设置只能输入密码
android:textColor = "#ff8c00"//字体颜色
android:textStyle="bold"//字体,bold, italic, bolditalic
android:textSize="20dip"//大小
android:capitalize="characters"//以大写字母写,设置英文字母大写类型。设置如下值:sentences仅第一个字母大写;words每一个单词首字母大小,用空格区分单词;characters每一个英文字母都大写。
android:textAlign="center"//EditText没有这个属性,但TextView有,居中
android:textColorHighlight="#cccccc"//被选中文字的底色,默认为蓝色
android:textColorHint="#ffff00"//设置提示信息文字的颜色,默认为灰色
android:textScaleX="1.5"//控制字与字之间的间距
android:typeface="monospace"//字型,normal, sans, serif, monospace
android:background="@null"//背景,这里没有,指透明
android:layout_weight="1"//权重,控制控件之间的地位,在控制控件显示的大小时蛮有用的。
android:textAppearance="?android:attr/textAppearanceLargeInverse"//文字外观,这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。
android:layout_gravity="center_vertical"//设置控件显示的位置:默认top,这里居中显示,还有bottom
android:gray="top"//多行中指针在第一行第一位置
et.setSelection(et.length());//调整光标到最后一行
android:autoText //自动拼写帮助
android:digits //设置只接受某些数字
android:phoneNumber //输入电话号码
android:editable //是否可编辑
android:autoLink=”all” //设置文本超链接样式当点击网址时,跳向该网址
android:cursorVisible="false" //隐藏光标
android:background="#00000000"//不要文本框背景
android:textAppearance="?android:attr/textAppearanceLargeInverse"//文字外观,这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。不知道这样理解对不对?
属性名称描述
android:autoLink//设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)
android:autoText//如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。
android:bufferType//指定getText()方式取得的文本类别。选项editable 类似于StringBuilder可追加字符,也就是说getText后可调用append方法设置文本内容。spannable 则可在给定的字符区域使用样式,参见这里1、这里2。
android:capitalize//设置英文字母大写类型。此处无效果,需要弹出输入法才能看得到,参见EditView此属性说明。
android:cursorVisible//设定光标为显示/隐藏,默认显示。
android:digits//设置允许输入哪些字符。如“1234567890.+-*/% ()”
android:drawableBottom//在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。
android:drawableLeft//在text的左边输出一个drawable,如图片。
android:drawablePadding//设置text与drawable(图片)的间隔,与drawableLeft、drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。
android:drawableRight//在text的右边输出一个drawable,如图片。
android:drawableTop//在text的正上方输出一个drawable,如图片。
android:editable//设置是否可编辑。这里无效果,参见EditView。
android:editorExtras//设置文本的额外的输入数据。在EditView再讨论。
android:ellipsize//设置当文字过长时,该控件该如何显示。有如下值设置:”start”—?省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)
android:freezesText//设置保存文本的内容以及光标的位置。参见:这里。
android:gravity//设置文本位置,如设置成“center”,文本将居中显示。
android:hintText//为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。此属性在EditView中使用,但是这里也可以用。
android:imeOptions//附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角将显示一个“完成”,而不设置默认是一个回车符号。这个在EditView中再详细说明,此处无用。
android:imeActionId//设置IME动作ID。在EditView再做说明,可以先看这篇帖子:这里。
android:imeActionLabel//设置IME动作标签。在EditView再做说明。
android:includeFontPadding//设置文本是否包含顶部和底部额外空白,默认为true。
android:inputMethod//为文本指定输入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是这里报错找不到。
android:inputType//设置文本的类型,用于帮助输入法显示合适的键盘类型。在EditView中再详细说明,这里无效果。
android:linksClickable//设置链接是否点击连接,即使设置了autoLink。
android:marqueeRepeatLimit//在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为marquee_forever时表示无限次。
android:ems//设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度,如图:
android:maxEms//设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。
android:minEms//设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。
android:maxLength//限制显示的文本长度,超出部分不显示。
android:lines//设置文本的行数,设置两行就显示两行,即使第二行没有数据。
android:maxLines//设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。
android:minLines//设置文本的最小行数,与lines类似。
android:lineSpacing//Extra设置行间距。
android:lineSpacingMultiplier//设置行间距的倍数。如”1.2”
android:numeric//如果被设置,该TextView有一个数字输入法。此处无用,设置后唯一效果是TextView有点击效果,此属性在EdtiView将详细说明。
android:password//以小点”.”显示文本
android:phoneNumber//设置为电话号码的输入方式。
android:privateImeOptions//设置输入法选项,此处无用,在EditText将进一步讨论。
android:scrollHorizontally//设置文本超出TextView的宽度的情况下,是否出现横拉条。
android:selectAllOnFocus//如果文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。TextView中设置后无效果。
android:shadowColor//指定文本阴影的颜色,需要与shadowRadius一起使用。效果:
android:shadowDx//设置阴影横向坐标开始位置。
android:shadowDy//设置阴影纵向坐标开始位置。
android:shadowRadius//设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好。
android:singleLine//设置单行显示。如果和layout_width一起使用,当文本不能全部显示时,后面用“…”来表示。如android:text="test_ singleLine " android:singleLine="true" android:layout_width="20dp"将只显示“t…”。如果不设置singleLine或者设置为false,文本将自动换行
android:textStyle//设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个,用“|”隔开
android:typeface//设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3]
android:maxHeight//设置文本区域的最大高度
android:minHeight//设置文本区域的最小高度
android:maxWidth//设置文本区域的最大宽度
android:minWidth//设置文本区域的最小宽度
android:textAppearance//设置文字外观。如“?android:attr/textAppearanceLargeInverse
”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。可设置的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
android:textAppearance设置文字外观。如“?android:attr/textAppearanceLargeInverse
”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。可设置的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse
使用EditText的addTextChangedListener(TextWatcher watcher)方法对EditText实现监听,TextWatcher是一个接口类,所以必须实现TextWatcher里的抽象方法:
例子一:
text.addTextChangedListener(textWatcher);
private TextWatcher textWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
Log.d("TAG","afterTextChanged--------------->");
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
Log.d("TAG","beforeTextChanged--------------->");
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
Log.d("TAG","onTextChanged--------------->");
str = text.getText().toString();
try {
//if ((heighText.getText().toString())!=null)
Integer.parseInt(str);
} catch (Exception e) {
// TODO: handle exception
showDialog();
}
}
};
private void showDialog(){
AlertDialog dialog;
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("消息").setIcon(android.R.drawable.stat_notify_error);
builder.setMessage("你输出的整型数字有误,请改正");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
dialog = builder.create();
dialog.show();
}
例子二:
et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
tv.setText("还能输入"+Rest_Length+"个字");
}
@Override
public void afterTextChanged(Editable s) {
tv.setText("还能输入"+Rest_Length+"个字");
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(Rest_Length>0){
Rest_Length = MAX_LENGTH - et.getText().length();
}
}
});
clearBtn.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
et.setText("");
Rest_Length = MAX_LENGTH;
}
});
}
et.setFocusable(true);
et.setFocusableInTouchMode(true);
et.requestFocus();
et.clearFocus();//失去焦点
et.requestFocus();//获取焦点
如果在Activity中的布局的下方有EditText,获取焦点弹出软键盘的时候,如果不做处理,软键盘可能会遮挡输入框,用户提现不好,网上也有很多人提出结局方案,这里就分析一下解决的效果.
需要用到EditText的布局大概分为两种,一种是页面显示的内容不希望有残缺,比如软键盘把标题挤出了屏幕,如登录注册搜索等,EditText多半在页面上半部分.另一种是页面的上半部分不重要,比如聊天窗口,软键盘弹出的时候,上半部分的聊天记录可以被基础屏幕外,EditText多半在最下方.其他的情况可以根据本文做出选择,结果在最下面.
开始:
网上针对这个问题解决的方法大概这么几种:
1.修改AndroidManifest.xml文件
2.在Activity中添加配置
3.在布局文件中添加ScrollView
1.修改AndroidManifest.xml文件
在AndroidManifest.xml中对应的Activity配置:android:windowSoftInputMode=”stateVisible|adjustResize”
<activity
android:name=".LoginActivity"
//显示软键盘,并让布局压缩 android:windowSoftInputMode="stateVisible|adjustResize"
android:screenOrientation="portrait">
activity>
含义:该页面在弹出软键盘的同时屏幕内容被压缩,以腾出软键盘的空间.
解释它们的含义:
stateUnspecified
//:界面没有设置"android:windowSoftInputMode"时的状态.这个状态是弹出有EditText的界面时时不弹出软键盘的,当EditText获取焦点的时候弹出软件盘
stateUnchanged
//:状态不改变,意思就是和上一个界面相同,上一个界面弹出软键盘,跳转到这个界面时,软键盘也是弹出状态.
stateHidden
//:隐藏键盘,弹出这个界面的时候,不管上个界面是什么状态,这个界面的软键盘都是隐藏的.
stateAlwaysHidden
//:一直隐藏(跟上面的区别未知,试不出来).
stateVisible
//:强制弹出软键盘.跳转到界面后,没有EditText也弹出键盘.
stateAlwaysVisible
//:一直显示键盘(同上).
这里开始就是跟内容相关的了,也跟本文也相关
adjustUnspecified
//:算是默认方式.如果界面没有被ScrowView包裹,键盘会挡住一部分内容,如果界面被ScrowView包裹了,会让ScrowView中的内容滚动,以放下软键盘.
adjustResize
//:主界面会缩放,用来放置软键盘.
adjustPan
//:主界面不会缩放,会向上移来放置软键盘
上面两个不同的地方在于,如果内容是listview,当显示最下面一个item后弹出软键盘,adjustResize会让listview下沿被软键盘挡住,adjustPan则还是显示最下面一个item.
2.在Activity中添加配置
在该Activity中的onCretae()的setContentView()方法前面添加:getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)
含义:把整个Layout顶上去露出获得焦点的EditText,不压缩多余空间.
解释他们的含义:
SOFT_INPUT_ADJUST_NOTHING
//: 不调整(输入法完全直接覆盖住,未开放此参数);
SOFT_INPUT_ADJUST_PAN
//:把整个Layout顶上去露出获得焦点的EditText,不压缩多余空间
SOFT_INPUT_ADJUST_RESIZE
//: 整个Layout重新编排,重新分配多余空间;
SOFT_INPUT_ADJUST_UNSPECIFIED
//: 系统自己根据内容自行选择上两种方式的一种执行(默认配置).
这里SOFT_INPUT_ADJUST_RESIZE和SOFT_INPUT_ADJUST_PAN和上面中的adjustResize和adjustPan效果是一样的.
@Overrideprotected
void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//让布局向上移来显示软键盘
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
setContentView(R.layout.activity_login);
init();
}
3.在布局文件中添加ScrollView
ScrollView是能让弹出的软键盘添加到布局的下面,从而不挡住部分布局.这里往往需要跟上面的adjustResize和adjustPan两个状态一起用.
布局:
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="8"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<EditText
android:layout_width="match_parent"
android:layout_height="50dp" />
LinearLayout>
ScrollView>
向上移的方式 设置:
<activity
android:name=".SecondActivity"
android:windowSoftInputMode="adjustPan">
activity>
压缩的方式 设置:
<activity
android:name=".SecondActivity"
android:windowSoftInputMode="adjustResize">activity>
结果:
只要弹出软键盘会影响到布局的情况,都用ScrollView把布局包裹起来,被包裹的内容就是可能被缩放或挤出屏幕外的内容.然后根据EditText的位置判断用adjustResize还是用adjustPan.
adjustResize是收缩,adjustPan是向上挤
个人推荐,登录注册用adjustResize,聊天窗口用adjustPan
参考:
Activity启动后EditText是否自动弹出输入法虚拟键盘的问题
Android文本输入框EditText方法说明和属性
Android EditView属性详细介绍
【Android进阶学习】监听EditText的变化
EditText弹出软键盘遮住输入框问题
参考:
https://zhidao.baidu.com/question/303588034660071684.html?qq-pf-to=pcqq.group
andorid editext android:digits=”abcdefghijklmnopqrstuvwxyz”
用代码写来控制规则
设置 android:digits 属性即可
例如:
android:digits = “abcdef”
有两种方法可以实现:
方法一:
EditText mEditText = (EditText)findViewById(R.id.MyEditText);
String digits = "abcdef";
mEditText.setKeyListener(DigitsKeyListener.getInstance(digits));
方法二:
EditText mEditText = (EditText)findViewById(R.id.MyEditText);
InputFilter[] filters = new InputFilter[1];
filters[0] = new MyInputFilter("abcdef");
mEditText.setFilters(filters);
public class MyInputFilter extends LoginFilter.UsernameFilterGeneric {
private String mAllowedDigits;
public PopInputFilter( String digits ) {
mAllowedDigits = digits;
}
@Override
public boolean isAllowed(char c) {
if (mAllowedDigits.indexOf(c) != -1) {
return true;
}
return false;
}
}