Android 开发笔记___EditText__文本编辑框
常用属性:
- inputType:(代码中:setiputtype)设置输入类型,多种类型中间用“|”
- maxlength:最大长度,无法通过代码设置
- hint:提示文本内容,(代码中:setHint)
- textColorHint:提示文本颜色,(代码中:setHintTextColor)
输入类型取值说明:
| 输入类型 | 说明 |
| text | 文本 |
| textPassword | 文本密码,“*”代替 |
| number | 整型数 |
| number signed | 带符号的数,开头带符号“-” |
| number decimal | 带小数点的数字 |
| number password | 数字密码 |
| DATe time | 时间日期,允许输入:横线、斜杠、空格、冒号 |
| date | 日期格式 |
| time | 时间格式 |
在实际开发当中主要有以下四个方面的基本操作:
1、更换编辑框的光标
- cursorVisible:指定光标是否可见,(代码中:set cursorvisible)
- textcursorDrawable:指定 光标的图像,无法在代码里面设置
2、更换编辑框的边框
- 边框通过background属性设置,隐藏边框的时候,background=@null
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/shape_edit_focus"/>
<item android:drawable="@drawable/shape_edit_normal"/>
</selector>
上面代码可以看出,当编辑框获得焦点时,边框就会显示对应的图形shape_edit_focus,否则显示,默认的图形
3、 自动隐藏输入法
- 获取文本最大长度
由于Edittext没有提供获取最大长度方法,需要用到反射
public static int getMaxLength(EditText et) {
int length = 0;
try {
InputFilter[] inputFilters = et.getFilters();
for (InputFilter filter : inputFilters) {
Class<?> c = filter.getClass();
if (c.getName().equals("android.text.InputFilter$LengthFilter")) {
Field[] f = c.getDeclaredFields();
for (Field field : f) {
if (field.getName().equals("mMax")) {
field.setAccessible(true);
length = (Integer) field.get(filter);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return length;
}
- 监控当前输入的文本长度
需要实现TextWatcher接口,
private class HideTextWatcher implements TextWatcher {
private EditText mView;
private int mMaxLength;
private CharSequence mStr;
public HideTextWatcher(EditText v) {
super();
mView = v;
mMaxLength = ViewUtil.getMaxLength(v);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mStr = s;
}
@Override
public void afterTextChanged(Editable s) {
if (mStr == null || mStr.length() == 0)
return;
if (mStr.length() == 11 && mMaxLength == 11) {
ViewUtil.hideAllInputMethod(EditHideActivity.this);
}
if (mStr.length() == 6 && mMaxLength == 6) {
ViewUtil.hideOneInputMethod(EditHideActivity.this, mView);
}
}
}
- 关闭软键盘
public static void hideAllInputMethod(Activity act) {
InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
//软键盘如果已经打开则关闭之
if (imm.isActive() == true) {
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
public static void hideOneInputMethod(Activity act, View v) {
InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
隐藏软键盘测试类:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_hide"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp" > <View
android:layout_width="match_parent"
android:layout_height="20dp" /> <EditText
android:id="@+id/et_phone"
style="@style/text_normal"
android:hint="输入11位时自动隐藏输入法"
android:inputType="number"
android:maxLength="11"
android:background="@drawable/editext_selector" /> <View
android:layout_width="match_parent"
android:layout_height="20dp" /> <EditText
android:id="@+id/et_password"
style="@style/text_normal"
android:hint="输入6位时自动隐藏输入法"
android:inputType="numberPassword"
android:maxLength="6"
android:background="@drawable/editext_selector" /> <View
android:layout_width="match_parent"
android:layout_height="20dp" /> <EditText
android:id="@+id/et_other"
style="@style/text_normal"
android:hint="点击外部空白处隐藏输入法"
android:inputType="text"
android:background="@drawable/editext_selector" /> </LinearLayout>
package com.example.alimjan.hello_world; import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout; import com.example.alimjan.hello_world.Utils.ViewUtil; /**
* Created by alimjan on 7/3/2017.
*/ public class class_3_4_1_3 extends AppCompatActivity implements View.OnClickListener { private LinearLayout ll_hide;
private EditText et_phone;
private EditText et_password;
private EditText et_other; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.code_3_4_1_3); ll_hide= (LinearLayout) findViewById(R.id.ll_hide);
et_phone= (EditText) findViewById(R.id.et_phone);
et_password= (EditText) findViewById(R.id.et_password);
et_other= (EditText) findViewById(R.id.et_other); ll_hide.setOnClickListener(this);
et_phone.addTextChangedListener(new HideTextWatcher(et_phone));
et_password.addTextChangedListener(new HideTextWatcher(et_password));
} @Override
public void onClick(View v) {
if (v.getId() == R.id.ll_hide) {
//实际上不只是et_other的软键盘会关闭,其它编辑框的软键盘也会关闭
//因为方法内部去获取视图的WindowToken,这个Token在每个页面上都是唯一的
ViewUtil.hideOneInputMethod(class_3_4_1_3.this, et_other);
}
} private class HideTextWatcher implements TextWatcher {
private EditText mView;
private int mMaxLength;
private CharSequence mStr; public HideTextWatcher(EditText v) {
super();
mView = v;
mMaxLength = ViewUtil.getMaxLength(v);
} @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
} @Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mStr = s;
} @Override
public void afterTextChanged(Editable s) {
if (mStr == null || mStr.length() == 0)
return;
if (mStr.length() == 11 && mMaxLength == 11) {
ViewUtil.hideAllInputMethod(class_3_4_1_3.this);
}
if (mStr.length() == 6 && mMaxLength == 6) {
ViewUtil.hideOneInputMethod(class_3_4_1_3.this, mView);
}
}
} public static void startHome(Context mContext) {
Intent intent = new Intent(mContext, class_3_4_1_3.class);
mContext.startActivity(intent);
}
}

4、输入回车符自动跳转
主要是判断输入的内容里面有么有换行符/回车符
private class JumpTextWatcher implements TextWatcher {
private EditText mThisView = null;
private View mNextView = null;
public JumpTextWatcher(EditText vThis, View vNext) {
super();
mThisView = vThis;
if (vNext != null) {
mNextView = vNext;
}
}
@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) {
String str = s.toString();
//发现输入回车符或换行符
if (str.indexOf("\r") >= 0 || str.indexOf("\n") >= 0) {
//去掉回车符和换行符
mThisView.setText(str.replace("\r", "").replace("\n", ""));
if (mNextView != null) {
//让下一个视图获得焦点,即将光标移到下个视图
mNextView.requestFocus();
if (mNextView instanceof EditText) {
EditText et = (EditText)mNextView;
//让光标自动移到编辑框内部的文本末尾
//方式一:直接调用EditText的setSelection方法
et.setSelection(et.getText().length());
//方式二:调用Selection类的setSelection方法
//Editable edit = et.getText();
//Selection.setSelection(edit, edit.length());
}
}
}
}
}
测试:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="20dp"
android:paddingRight="20dp" > <View
android:layout_width="match_parent"
android:layout_height="20dp" /> <EditText
android:id="@+id/et_username"
style="@style/text_normal"
android:hint="请输入用户名"
android:inputType="text"
android:background="@drawable/editext_selector" /> <View
android:layout_width="match_parent"
android:layout_height="20dp" /> <EditText
android:id="@+id/et_password"
style="@style/text_normal"
android:hint="请输入密码"
android:inputType="textPassword"
android:background="@drawable/editext_selector" /> <View
android:layout_width="match_parent"
android:layout_height="20dp" /> <Button
android:id="@+id/btn_login"
style="@style/btn_relative"
android:layout_width="match_parent"
android:text="登录" /> </LinearLayout>
package com.example.alimjan.hello_world; import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; /**
* Created by alimjan on 7/3/2017.
*/ public class class_3_4_1_4 extends AppCompatActivity implements View.OnClickListener { private EditText et_username;
private EditText et_password;
private Button btn_login; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.code_3_4_1_4); et_username= (EditText) findViewById(R.id.et_username);
et_password= (EditText) findViewById(R.id.et_password);
btn_login = (Button) findViewById(R.id.btn_login);
et_username.addTextChangedListener(new JumpTextWatcher(et_username, et_password));
et_password.addTextChangedListener(new JumpTextWatcher(et_password, btn_login));
btn_login.setOnClickListener(this);
} @Override
public void onClick(View v) {
if (v.getId() == R.id.btn_login) {
Toast.makeText(this, "这个登录按钮啥事也没做", Toast.LENGTH_SHORT).show();
}
} private class JumpTextWatcher implements TextWatcher { private EditText mThisView = null;
private View mNextView = null; public JumpTextWatcher(EditText vThis, View vNext) {
super();
mThisView = vThis;
if (vNext != null) {
mNextView = vNext;
}
} @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) {
String str = s.toString();
//发现输入回车符或换行符
if (str.indexOf("\r") >= 0 || str.indexOf("\n") >= 0) {
//去掉回车符和换行符
mThisView.setText(str.replace("\r", "").replace("\n", ""));
if (mNextView != null) {
//让下一个视图获得焦点,即将光标移到下个视图
mNextView.requestFocus();
if (mNextView instanceof EditText) {
EditText et = (EditText)mNextView;
//让光标自动移到编辑框内部的文本末尾
//方式一:直接调用EditText的setSelection方法
et.setSelection(et.getText().length());
//方式二:调用Selection类的setSelection方法
//Editable edit = et.getText();
//Selection.setSelection(edit, edit.length());
}
}
}
}
} public static void startHome(Context mContext) {
Intent intent = new Intent(mContext, class_3_4_1_4.class);
mContext.startActivity(intent);
} }

Android 开发笔记___EditText__文本编辑框的更多相关文章
- Android 开发笔记 “弹出框”
AlertDialog.Builder builder = new AlertDialog.Builder(Activity.this); builder.setMessage("Are y ...
- 【转】Android开发笔记(序)写在前面的目录
原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步
1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出 ...
- [置顶] Android开发笔记(成长轨迹)
分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用
1.前言 学习ArcGIS Runtime SDK开发,其实最推荐的学习方式是直接看官方的教程.示例代码和帮助文档,因为官方的示例一般来说都是目前技术最新,也是最详尽的.对于ArcGIS Runtim ...
- Android开发笔记:打包数据库
对于数据比较多的控制一般会加入SQLite数据库进行数据存储,在打包时这些数据库是不自动打包到apk中的,如何创建数据库呢 方法1:将创建数据库的sql语句在SQLiteHelper继承类中实现,在第 ...
- Android开发笔记--hello world 和目录结构
原文:Android开发笔记--hello world 和目录结构 每接触一个新东西 都有一个hello world的例子. 1.新建项目 2.配置AVD AVD 没有要新建个,如果不能创建 运行SD ...
- [APP] Android 开发笔记 003-使用Ant Release 打包与keystore加密说明
接上节 [APP] Android 开发笔记 002 5. 使用ant release 打包 1)制作 密钥文件 release.keystore (*.keystore) keytool -genk ...
- [APP] Android 开发笔记 002-命令行创建默认项目结构说明
接上节:[APP] Android 开发笔记 001 4. 默认项目结构说明: 这里我使用Sublime Text 进行加载.
随机推荐
- 《HelloGitHub》第 18 期
<HelloGitHub>第 18 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程. ...
- Spring学习—生成图片验证码
今天想学下一下验证码的生成,就之前搭建好的一个spring框架上写了一个demo,我会贴出细节代码,但是spring的配置就不在介绍了.需要完整代码可以联系我! 会从前台页面到后台实现完整的讲解: 1 ...
- 洗礼灵魂,修炼python(7)--元组,集合,不可变集合
前面已经把列表的基本用法讲解完 接着讲python的几大核心之--元组(tuple) 1.什么是元组? 类似列表,但为不可变对象,之前提到列表是可变对象,所谓可变对象就是支持原处修改,并且在修改前后对 ...
- 51nod 1414 冰雕 思路:暴力模拟题
题意是现在有n个雕像把一个圆等分了,每一个雕像有一个吸引力. 叫你不移动雕像只去掉雕像让剩下的雕像还能等分这个圆,求剩下的雕像的吸引力之和的最大值. 显然去掉后剩下雕像的间隔应该是n的因子,因为这样才 ...
- 分享基于分布式Http长连接框架--架构模型
我画了个简单的架构图来帮助说明: 其实为发布订阅架构模式. 生产者和消费者我们统一可理解为客户端,消息中间件可认为是服务端. 生产者和消费者做为客户端要跟服务端交互,则先通过代理订阅服务端,订阅成功后 ...
- The Moving Points hdu4717
The Moving Points Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Docker 最常用的监控方案 - 每天5分钟玩转 Docker 容器技术(78)
当 Docker 部署规模逐步变大后,可视化监控容器环境的性能和健康状态将会变得越来越重要. 在本章中,我们将讨论几个目前比较常用的容器监控工具和方案,为大家构建自己的监控系统提供参考. 首先我们会讨 ...
- Elixir游戏服设计五
在<Elixir游戏服设计一>里提到,按照系统功能划分成app要保证原子性很难, 现在想想也没那么难.保证原子性,无非就是需要某个单点去完成操作.那么选择玩家进程去做原子性工作就可以了. ...
- Winform常用的一些功能收集(持续更新)
#region progressBar实时显示进度 private void button1_Click(object sender, EventArgs e) { int i = 10000; pr ...
- JAVA基础总结2
2.1 关键字 常用的关键字主要包括如下: 2.2 标识符 简单而言标识符它其实就是用于标识某些东西的符号. 2.3 注释的应用 注释说明 注释的作用: 注释的应用: 2.4 常量和变量 常量的定义与 ...