直接上代码:
package com.example.ipedittext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import android.content.Context;
import android.graphics.Color;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.widget.EditText;
public class IpEditer extends EditText {
int mMaxLenth = 15;
int color = Color.BLACK;
public IpEditer(Context context, AttributeSet attrs) {
super(context, attrs);
this.setInputType(InputType.TYPE_CLASS_PHONE);
this.setFilters(new InputFilter[] { new InputFilter.LengthFilter(
mMaxLenth) });
this.addTextChangedListener(mTextWatcher);
}
public String stringFilter(String str) throws PatternSyntaxException {
String regEx = "[/\\:#*?<>|\"\n\ta-zA-Z]";
String tmp = null;
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
if (m.find()) {
tmp = m.replaceAll(".");
for (int i = 0; i < tmp.length(); i++) {
if (tmp.charAt(i) != str.charAt(i)) {
changedIndex = i;
break;
}
}
} else {
return str;
}
return tmp;
}
int ipType = IPTYPE_IPV4;
public static final int IPTYPE_IPV4 = 0;
public static final int IPTYPE_IPV6 = 1;
public int getIpType() {
return ipType;
}
public void setIpType(int ipType) {
this.ipType = ipType;
}
TextWatcher mTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
String editable = IpEditer.this.getText().toString();
String str = stringFilter(editable);
if (!editable.equals(str)) {
IpEditer.this.setText(str);
IpEditer.this.setSelection(++changedIndex);
}
}
};
int changedIndex;
public int getChangedIndex() {
return changedIndex;
}
/**
* Get ip
*
* @return ip
*/
public String getIpText() {
return this.getText().toString();
}
private String regexIpv4 = "^((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)$";
private String regexIpv6 = "^/^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/$";
/**
* detecting ip format
*
* @param text
* the ip would be matched
* @return true if the text is ip, else return false
*/
public boolean isIpv4Text() {
return getIpText().matches(regexIpv4);
}
public void checkFormat() {
if (getIpText().matches(regexIpv4)) {
this.setTextColor(color);
} else {
this.setTextColor(Color.RED);
}
}
public boolean isIpv6Text() {
return getIpText().matches(regexIpv6);
}
/**
* Set ip into IpEditer
*
* @param ipText
* ip
*/
public void setIpText(String ipText) {
if (ipText == null || ipText.length() <= 0) {
return;
}
this.setText(ipText);
}
}
限制Edittext内容输入,当输入非数字时用“.”代替,避免遥控器无法输入“.”号,也不必呼出软键盘。