Android - InputFilter

本文介绍了一种使用Android的InputFilter实现文本输入限制的方法,通过自定义过滤器确保输入内容符合特定规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.oocl.filter;

import android.app.Activity;
import android.os.Bundle;
import android.text.InputFilter;
import android.text.Spanned;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class InputFilterTestActivity extends Activity {
	/** Called when the activity is first created. */
	private TextView myText;
	private EditText myEdit;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		String str = "Longfu2012";
		setContentView(R.layout.main);
		myText = (TextView) findViewById(R.id.myText);
		myText.setText("输入后面字符:"+str);
		myEdit = (EditText) findViewById(R.id.myEdit);
		myEdit.setFilters(new InputFilter[] { new MyFilter(str) });

	}

	public class MyFilter implements InputFilter {
		String ch = null;
		String str = null;

		public MyFilter(String str) {
			this.str = str;
		}

		public CharSequence filter(CharSequence source, int start, int end,
				Spanned dest, int dstart, int dend) {
			//最后输入的一个字符
			if (dest.length() < str.length()) {
				//截取未过滤的最后一个字符
				ch = str.substring(dstart + start, dstart + end);
			} else {
				return dest.subSequence(dstart, dend);
			}

			if (ch.equals(source)) {
				Toast.makeText(InputFilterTestActivity.this, "符合要求",
						Toast.LENGTH_SHORT).show();
				//符合规定要求的字符以原输入显示
				return dest.subSequence(dstart, dend) + source.toString();
			} else {
				Toast.makeText(InputFilterTestActivity.this, "不符合要求喔~",
						Toast.LENGTH_SHORT).show();
				//如果没有按要求输入字符,则该字符被“*”代替,并显示
				return dest.subSequence(dstart, dend) + "*";
			}

		}

	}
}


### 实现身份证号码校验的 InputFilter 方法 为了实现在 Android 中对身份证号码的有效性和格式进行实时验证,可以创建自定义 `InputFilter` 类来过滤并检验输入的内容。下面展示了一个用于身份证号校验的具体实现方式。 #### 自定义 InputFilter 进行身份证号码校验 通过继承 `InputFilter` 接口,并重写其抽象方法 `filter()` 来构建一个专门针对身份证号码的过滤器: ```java public class IDNumberInputFilter implements InputFilter { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { String idNumber = dest.toString() + source.toString(); // 如果不是18位,则不允许继续输入 if (idNumber.length() > 18){ return ""; } // 对于长度为17或18的情况做进一步合法性检查 if ((idNumber.length() == 17 || idNumber.length() == 18)){ boolean isValidID = validateID(idNumber); // 若不合法则清空本次输入 if (!isValidID && !source.equals("")) { return ""; } } return null; } private static final char[] WEIGHT_FACTORS = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; private static final char[] CHECK_CODES = {'1','0','X','9','8','7','6','5','4','3','2'}; /** * 验证给定字符串是否是一个有效的中国公民身份号码. */ private boolean validateID(String idNumber){ try{ long n = 0; for(int i=0; i<17;i++){ n += Character.digit(idNumber.charAt(i), 10)*WEIGHT_FACTORS[i]; } char lastChar = idNumber.charAt(17); // 计算最后一位验证码 char checkCode = CHECK_CODES[n % 11]; // 判断计算出来的值与第十八位是否相同 return checkCode == lastChar; }catch(Exception e){ return false; } } } ``` 接着,在布局文件中的 `<EditText>` 组件上应用此过滤器: ```xml <EditText android:id="@+id/id_number_edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入您的身份证号码" android:inputType="number"/> ``` 在 Activity 或 Fragment 的初始化逻辑里设置该过滤器到对应的控件实例中去: ```java EditText editTextIdNumber = findViewById(R.id.id_number_edit_text); editTextIdNumber.setFilters(new InputFilter[]{new IDNumberInputFilter()}); ``` 这种方法可以在用户键入字符的同时即时反馈错误信息,从而提供更好的用户体验[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值