现在的位置: 首页 > 综合 > 正文

android EditText控件事件监听

2017年12月17日 ⁄ 综合 ⁄ 共 7659字 ⁄ 字号 评论关闭

在工作中,要实现一个类似iphone锁屏时候的密码解锁界面,要求每一个编辑框里输入只能输入一个字符,最后一个输入完成以后,自动执行下一步动作。整体界面如下图:

界面很简单,没有做美化,要控制EditText在每一次输入以后焦点移动到下一个控件上,并且按下删除按钮以后将数据全部删除,需要用到EditText控件中addTextChangedListener方法和setOnKeyListener方法。

当我们给一个editText添加一个addTextChangedListener方法后,需要实现以下几个方法:
 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  输入结束呈现在输入框中的信息  
       
        }  
    });

具体参数说明已经写清楚了,这里大家可以写一些调试信息,看一下这个接口中方法的调用过程。

在TextWatcher这个接口中,我们要实现onTextChanged
beforeTextChanged
afterTextChanged这三个方法,每当一个EditText的内容发生变化的时候(注意:不管你在什么位置,只要发生变化,这个接口就会监听到),系统会执行这3个方法,执行的步骤依次是:beforeTextChanged→onTextChanged→
afterTextChanged,所以我要实现的功能放到此处执行即可。

其次改界面还要求实现用户按下删除按钮以后,清空所有的数据,这里需要用到的就是EditText的setOnKeyListener方法了。这里抱怨一下,都是按键,竟然监听的接口不一样,也就是说你按键盘中的各种数字、字母不会进入onkey的监听,只会进入textChange的监听,而按下删除,回车等这些键以后,进入的是onkey的方法~~这样就会导致一些混乱,比如我在onkey的监听中更改了EditText的值,那么系统会立刻执行textChange监听接口的实现,执行过后,再次跳回onkey的监听。如果程序设计不好的话,这里就会出现很多奇怪的现象。

最后该界面要求进入的时候就要显示软键盘,这个在网上查找了一下,实现起来比较简单,在程序清单AndroidManifest.xml中,将这个activity设置软键盘的显示模式,并在初始化时保持一个EditText获取焦点,就会弹出键盘。
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>

抱歉!评论已关闭.