Android之编辑框(EditText)控件

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


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


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


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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/text01" 
        android:textSize="20sp" />
    
    <EditText 
        android:id="@+id/editText01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/edit_text01_hint"
        android:digits="@string/charsordigits" />
 
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/text02" 
        android:textSize="20sp" />
    
    <EditText 
        android:id="@+id/editText02"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/edit_text02_hint" />    
    
</LinearLayout>

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

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">myEditText</string>
    <string name="action_settings">Settings</string>
    <string name="text01">只允许输入英文字符和数字,最大长度为10</string>
    <string name="edit_text01_hint">0123456789</string>
    <string name="text02">只允许输入上面输入框中字符,无长度限制</string>
    <string name="edit_text02_hint">输入字符试试</string>
    <string name="charsordigits">
        0123456789abcdefghijklmnopqrstuvwxyz
    </string>

</resources>

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();
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值