简介
EditText(输入框),是安卓开发布局时比较常用的控件,和TextView非常类似,最大的区别是:EditText可以接受用户输入。
属性
属性 | 说明 |
---|---|
android:text="" | 输入的文本内容 |
android:textColor="" | 输入内容的颜色 |
android:textStyle="" | 输入内容的字体样式( bold - 加粗;italic - 斜体;normal - 普通) |
android:hint="" | 文本输入提示 |
android:textColorHint="" | 提示文本的字体颜色 |
android:selectAllOnFocus="" | 获取组件后全选组件内所有内容(为ture时,获取焦点时全选内容,默认为false) |
android:inputType="" | 输入内容的类型(number - 数字;numberDecimal - 浮点数) |
android:capitalize="" | 英文大写设置(characters - 每个英文字母都大写;sentences - 仅第一个字母大写;words - 每一个单词首字母大写,用空格区分单词) |
android:minLines="" | 最小行数 |
android:maxLines="" | 最大行数 |
android:singleLine="" | 单行,不换行(为true时,单行显示) |
android:maxLength="" | 输入字数限制 |
android:digits="" | 输入限制规则 例如:密码输入格式限制 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,. |
android:password="" | 文字为密码形式,样式: · · · · · · |
android:phoneNumber="" | 输入电话号码(为true时,起效) |
android:editable="" | 是否可编辑 |
android:focusable="" | 是否可获取焦点(为false时,软键盘永不弹出) |
应用场景
- EditText输入的文字为密码形式
(1)设置文字为密码的格式,密码不可见。
android:password="true"
(2)点击小眼睛密码显示隐藏,需要在代码中设置
//显示密码
mUserPwdEt.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
//隐藏密码
mUserPwdEt.setTransformationMethod(PasswordTransformationMethod.getInstance());
- 设置hint字号大小
//strings.xml文件中添加,设置字号为14
<string name="user_name_hint"><font size="14">请输入手机号</font></string>
//引用
android:hint="@string/user_name_hint"
- 登录模块,密码输入字符类型限制
之前找了一种禁止输入文字的代码校验(会出现bug):
//限制输入框不能输入汉字
public static void StringWatcher(EditText editText){
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (s.length() > 0) {
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 0x4e00 && c <= 0X9fff) {
s.delete(i,i+1);
}
}
}
}
});
}
以上这种方式确实可以实现禁止文字的输入,但是这里有一个问题,执行mUserPwdEt.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 密码设置为显示时,输入文字会报错误。报错如下:
2021-10-28 09:58:34.757 29046-29046/com.come.dispatch E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.come.dispatch, PID: 29046
java.lang.IndexOutOfBoundsException
at android.graphics.Paint.getRunAdvance(Paint.java:2947)
at android.text.TextLine.getRunAdvance(TextLine.java:827)
at android.text.TextLine.handleText(TextLine.java:878)
at android.text.TextLine.handleRun(TextLine.java:1118)
at android.text.TextLine.measureRun(TextLine.java:510)
at android.text.TextLine.measure(TextLine.java:378)
at android.text.TextLine.metrics(TextLine.java:306)
at android.text.Layout.getLineExtent(Layout.java:1441)
at android.text.Layout.getLineMax(Layout.java:1389)
at android.text.Layout.getLineRight(Layout.java:1379)
at android.widget.TextView.bringPointIntoView(TextView.java:9865)
at android.widget.TextView.updateAfterEdit(TextView.java:10635)
at android.widget.Editor.finishBatchEdit(Editor.java:1732)
at android.widget.Editor.endBatchEdit(Editor.java:1714)
at android.widget.TextView.endBatchEdit(TextView.java:8839)
at com.android.internal.widget.EditableInputConnection.endBatchEdit(EditableInputConnection.java:78)
at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:851)
at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:197)
at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:177)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:339)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:89)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7562)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
网上去找报错解决办法,没找下,于是换了另外一种方式。
目的:实现输入框 "仅支持输入数字、字母、符号,. "
android:digits="" 这是EditText的一个属性,以前是没有见过这个属性的,估计很少人知道的。
//strings.xml中添加
<string name="pwd_format">0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.</string>
//引用
<EditText
android:id="@+id/user_pwd_et"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_35"
android:background="@null"
android:hint="@string/password_hint"
android:maxLength="16"
android:maxLines="1"
android:paddingLeft="@dimen/dp_10"
android:paddingRight="@dimen/dp_38"
android:password="true"
android:digits="@string/pwd_format"
android:singleLine="true"
android:text=""
android:textColor="@color/color_text"
android:textSize="@dimen/sp_18" />
- 软键盘弹出后输入框被遮挡,想要实现输入框的整个父布局上移
/**
* 软键盘遮挡输入框,重新计算布局,使输入框上顶
* 在清单列表中 Activity设置上 android:windowSoftInputMode="adjustPan"
*
* @param root 最外层布局,需要调整的布局,title是不移动的,一般是title下方的布局
* @param scrollToView 被键盘遮挡的scrollToView,滚动root,使scrollToView在root可视区域的底部,一般是输入框或输入框的父布局
*/
public static void controlKeyboardLayout(final View root, final View scrollToView) {
// 注册一个回调函数,当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时调用这个回调函数。
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
// 获取root在窗体的可视区域
root.getWindowVisibleDisplayFrame(rect);
// 当前视图最外层的高度减去现在所看到的视图的最底部的y坐标
int rootInvisibleHeight = root.getRootView()
.getHeight() - rect.bottom;
Log.i("tag", "最外层的高度" + root.getRootView().getHeight());
// 若rootInvisibleHeight高度大于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);
}
}
});
}