在工作中,要实现一个类似iphone锁屏时候的密码解锁界面,要求每一个编辑框里输入只能输入一个字符,最后一个输入完成以后,自动执行下一步动作。整体界面如下图:
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence text, int start, int before, int count) {
//text 输入框中改变后的字符串信息
//start 输入框中改变后的字符串的起始位置
//before 输入框中改变前的字符串的位置 默认为0
//count 输入框中改变后的一共输入字符串的数量
}
@Override
public void beforeTextChanged(CharSequence text, int start, int count,int after) {
//text 输入框中改变前的字符串信息
//start 输入框中改变前的字符串的起始位置
//count 输入框中改变前后的字符串改变数量一般为0
//after 输入框中改变后的字符串与起始位置的偏移量
}
@Override
public void afterTextChanged(Editable edit) {
//edit 输入结束呈现在输入框中的信息
}
}); 具体参数说明已经写清楚了,这里大家可以写一些调试信息,看一下这个接口中方法的调用过程。 android:windowSoftInputMode = "adjustResize"<!--stateVisible 一直显示键盘 adjustResize 显示键盘时调整布局--> OK,最后贴出代码,方便以后查阅 /**
* 验证码的发送界面
* @author sC
*
*/
public class VerifyInterface extends Activity {
private View titleView;//标题栏布局
private LinearLayout titleLayout;//标题栏布局的容器
private Button rightButton;// 退出按钮
private ProgressBar waite;// 圆形进度条
private TextView txtAlert;//提醒文字
private EditText txt1, txt2, txt3, txt4, txt5, txt6;//接收验证码的6个EditText
private String code = "";//最后要发送的验证码
private EditText[] txts;
private static int count = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设定界面不显示标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.verifycode);
initTitle();
setListener();
}
/**
* 发送验证码
*/
private void sendCode() {
txtAlert.setText("发送验证码,请稍候....");
waite.setVisibility(ProgressBar.VISIBLE);
for (int i = 0; i < txts.length; i++) {
Log.e("sc", String.valueOf(i));
code += txts[i].getText().toString();
}
Toast.makeText(VerifyInterface.this, code, Toast.LENGTH_LONG).show();
}
/**
* 循环给每个EditText添加监听
*/
private void addTextListener() {
if (txts != null) {
for (int i = 0; i < txts.length; i++) {
txts[i].setOnKeyListener(key);
txts[i].addTextChangedListener(watcher);
}
}
}
OnKeyListener key = new View.OnKeyListener() {
public boolean onKey(View view, int i, KeyEvent keyevent) {
if (i == KeyEvent.KEYCODE_DEL) {
reset();
}
return false;
}
};
/**
* 内容改变的监听接口
*/
TextWatcher watcher = new TextWatcher() {
public void onTextChanged(CharSequence charsequence, int i, int j, int k) {
/**
* 如果当前的EditText中没有值,则执行
*/
if (j == 0) {
if (count < txts.length - 1) {
txts[++count].requestFocus();
} else {
sendCode();
}
}
}
public void beforeTextChanged(CharSequence charsequence, int i, int j,
int k) {
}
public void afterTextChanged(Editable editable) {
}
};
/**
* 清空数据
*/
public void reset() {
txtAlert.setText("请输入验证码");
waite.setVisibility(ProgressBar.INVISIBLE);
code = "";
count = 0;
for (int i = 0; i < txts.length; i++) {
// 清空改变监听
txts[i].removeTextChangedListener(watcher);
}
for (int j = 0; j < txts.length; j++) {
txts[j].setText("");
txts[j].clearFocus();
}
txt1.requestFocus();
addTextListener();
}
/**
* 设置监听动作
*/
private void setListener() {
findView();
addTextListener();
buttonListener();
}
/**
* 标题栏右上按钮的监听
*/
private void buttonListener() {
rightButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
reset();
}
});
}
/**
* 加载控件
*/
private void findView() {
txt1 = (EditText) findViewById(R.id.txtCode1);
txt1.setFocusable(true);
txt2 = (EditText) findViewById(R.id.txtCode2);
txt3 = (EditText) findViewById(R.id.txtCode3);
txt4 = (EditText) findViewById(R.id.txtCode4);
txt5 = (EditText) findViewById(R.id.txtCode5);
txt6 = (EditText) findViewById(R.id.txtCode6);
txts = new EditText[] { txt1, txt2, txt3, txt4, txt5, txt6 };
waite = (ProgressBar) findViewById(R.id.waite);
rightButton = (Button) titleLayout.findViewById(R.id.nav_rightButton);
txtAlert = (TextView) findViewById(R.id.txtAlert);
}
/**
* 初始化自定义标题栏
*/
private void initTitle() {
LayoutInflater inflater = (LayoutInflater) this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
titleView = inflater.inflate(R.layout.title, null);
titleLayout = (LinearLayout) findViewById(R.id.topLinearLayout);
titleLayout.addView(titleView);
}
/**
* 当程序因其他原因暂停返回以后,同样清空数据
*/
protected void onResume() {
reset();
super.onResume();
}
} 主布局文件: <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/topLinearLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="top" >
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="bottom"
android:layout_gravity="bottom">
<TextView
android:id="@+id/txtAlert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="请输入验证码"
android:textSize="30sp" />
<ProgressBar
android:id="@+id/waite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="invisible" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" android:gravity="bottom"
>
<EditText
android:id="@+id/txtCode1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="numberSigned"
android:maxLength="1"
android:gravity="center"/>
<EditText
android:id="@+id/txtCode2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="numberSigned"
android:maxLength="1"
android:gravity="center"/>
<EditText
android:id="@+id/txtCode3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="numberSigned"
android:maxLength="1"
android:gravity="center"/>
<EditText
android:id="@+id/txtCode4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="numberSigned"
android:maxLength="1"
android:gravity="center"/>
<EditText
android:id="@+id/txtCode5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="numberSigned"
android:maxLength="1"
android:gravity="center"/>
<EditText
android:id="@+id/txtCode6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="numberSigned"
android:maxLength="1"
android:gravity="center"/>
</LinearLayout>
</LinearLayout>
</LinearLayout> 标题栏布局文件 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="55dip"
android:background="@drawable/title_blue" >
<Button
android:id="@+id/nav_leftButton"
android:layout_width="60dip"
android:layout_height="45dip"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:text="返回"
android:textSize="16sp" />
<TextView
android:id="@+id/nav_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_toRightOf="@id/nav_leftButton"
android:text="验证"
android:textSize="20sp" />
<Button
android:id="@+id/nav_rightButton"
android:layout_width="60dip"
android:layout_height="45dip"
android:layout_centerVertical="true"
android:layout_marginRight="12dip"
android:layout_alignParentRight="true"
android:text="退出"
android:textSize="16sp" />
</RelativeLayout>
界面很简单,没有做美化,要控制EditText在每一次输入以后焦点移动到下一个控件上,并且按下删除按钮以后将数据全部删除,需要用到EditText控件中addTextChangedListener方法和setOnKeyListener方法。
beforeTextChanged
afterTextChanged这三个方法,每当一个EditText的内容发生变化的时候(注意:不管你在什么位置,只要发生变化,这个接口就会监听到),系统会执行这3个方法,执行的步骤依次是:beforeTextChanged→onTextChanged→
afterTextChanged,所以我要实现的功能放到此处执行即可。