Android之编辑框(EditText)控件

EditText类是TextView类的子类,也就是View类的一个子类,所以,View类的属性和方法EditText类全部继承了下来。


这个控件的主要目的是与用户进行交互,让用户可以输入自己想要输入的文本或者是图片。


以下举例一个应用,该应用的目的是利用EditText控件的属性以及其函数来限制控件输入的类型。


res/layout下的activity_main.xml中的内容改为如下:




    
    
    
 
    
    
        
    

res/values下的strings.xml中的内容改为:




    myEditText
    Settings
    只允许输入英文字符和数字,最大长度为10
    0123456789
    只允许输入上面输入框中字符,无长度限制
    输入字符试试
    
        0123456789abcdefghijklmnopqrstuvwxyz
    


Java源代码文件中的代码改为:

package com.example.myedittext;

import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextWatcher;
import android.view.Menu;
import android.widget.EditText;
//程序的主类
public class MainActivity extends Activity {
	private EditText editText01;
	private EditText editText02;
	private MyTextWatcher myTextWatcher;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//EditText空间变量与XML布局中的元素绑定
		editText01 = (EditText)findViewById(R.id.editText01);
		editText02 = (EditText)findViewById(R.id.editText02);
		
		//定义一个输入滤波器,在代码中限制editText01最大长度为10
		InputFilter[] ifs = {new InputFilter.LengthFilter(10)};
		editText01.setFilters(ifs);
		
		//设置显示内容
		editText01.setText("");
		
		//为控件editText02定义一个文字改变监听器
		myTextWatcher = new MyTextWatcher(editText02, "");
		
		//为控件editText02添加文字改变监听器
		editText02.addTextChangedListener(myTextWatcher);
		
		//为控件editText01定义一个文字改变监听器
		editText01.addTextChangedListener(new TextWatcher(){
//			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count){
				// Do nothing
			}
			
			public void beforeTextChanged(CharSequence s, int start, int count, int after){
				// Do nothing
			}
			
			public void afterTextChanged(Editable s){
				//去掉之前editText02的监听
				editText02.removeTextChangedListener(myTextWatcher);
				
				//用editText01中的字符串新建监听
				myTextWatcher = new MyTextWatcher(editText02, s.toString());
				
				//重新添加监听
				editText02.addTextChangedListener(myTextWatcher);
			}
		});
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

// 监听文本控件文字改变的类
class MyTextWatcher implements TextWatcher{
	//暂时存放上面一个控件的输入的值
	private String tmp = "";
	//可以输入的字符
	private String digits = "abcdef";
	private EditText editText;
	
	//构造函数
	public MyTextWatcher(final EditText editText, final String digits){
		this.editText = editText;
		this.digits = digits;
	}
	
	public void onTextChanged(CharSequence s, int start, int before, int count){
		
	}
	public void beforeTextChanged(CharSequence s, int start, int count, int after){
		//获得改变前的字符串
		tmp = s.toString();
	}
	
	public void afterTextChanged(Editable s){
		//如果tmp = str则返回,因为这是我们设置的结果,否则会形成死循环
		String str = s.toString();
		if(str.equals(tmp)){
			return;
		}
		
		StringBuffer sb = new StringBuffer();
		for(int i = 0; i < str.length(); ++i){
			//判断字符是否在可以输入的字符串中
			if(digits.indexOf(str.charAt(i)) >= 0){
				//如果是,就添加到结果里,否则跳过
				sb.append(str.charAt(i));
			}
		}
		//设置tmp, 因为下面一句还会导致该事件被触发
		tmp = sb.toString();
		//设置结果
		editText.setText(tmp);
		//更新控件内容
		editText.invalidate();
	}
	
}


你可能感兴趣的:(Android)