这是我的EditText,并希望使其仅接受IP地址。我使用numberDecimal作为inputType但它不接受多个点。
<EditText
android:id="@+id/etBannedIpAddress"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:hint="IP Address"
android:inputType="numberDecimal"
android:textAppearance="@android:style/TextAppearance.Small"
android:textColor="@color/blue_text" />
答案 0 :(得分:12)
尝试这样: 通过使用输入过滤器,我们可以在输入值之前过滤数据。
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end,
android.text.Spanned dest, int dstart, int dend) {
if (end > start) {
String destTxt = dest.toString();
String resultingTxt = destTxt.substring(0, dstart)
+ source.subSequence(start, end)
+ destTxt.substring(dend);
if (!resultingTxt
.matches("^\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3})?)?)?)?)?)?")) {
return "";
} else {
String[] splits = resultingTxt.split("\\.");
for (int i = 0; i < splits.length; i++) {
if (Integer.valueOf(splits[i]) > 255) {
return "";
}
}
}
}
return null;
}
};
editTxxt.setFilters(filters);
答案 1 :(得分:4)
方法1 :使用输入过滤器,请尝试以下代码:
EditText text = new EditText(this);
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (end > start) {
String destTxt = dest.toString();
String resultingTxt = destTxt.substring(0, dstart) + source.subSequence(start, end) + destTxt.substring(dend);
if (!resultingTxt.matches ("^\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3})?)?)?)?)?)?")) {
return "";
} else {
String[] splits = resultingTxt.split("\\.");
for (int i=0; i<splits.length; i++) {
if (Integer.valueOf(splits[i]) > 255) {
return "";
}
}
}
}
return null;
}
};
text.setFilters(filters);
它检查是否存在四个数字,以点分隔,但没有一个大于255.验证是实时进行的,即在输入时。
但您需要编写如上所述的自定义输入过滤器代码。
方法2:添加android:inputType="number|numberDecimal"
和android:digits="0123456789."
<EditText
android:id="@+id/ip_address"
android:inputType="number|numberDecimal"
android:digits="0123456789."
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
答案 2 :(得分:0)
我用这个:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
private static final String IPV4_REGEX =
"^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
private static final Pattern IPv4_PATTERN = Pattern.compile(IPV4_REGEX);
之后
boolean verifyIP()
{
String ip = textview.getText().toString();
if (ip == null) return false;
Matcher matcher = IPv4_PATTERN.matcher(ip);
return matcher.matches();
}
答案 3 :(得分:0)
如果您想在 Kotlin 中执行此操作,并且还要向 IP 添加端口。
private fun setEditText() {
val input = binding.etPuerto
input.inputType = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
val filters = arrayOfNulls<InputFilter>(1)
filters[0] = filterIP()
input.filters = filters
}
private fun filterIP(): InputFilter {
return InputFilter { source, start, end, dest, dstart, dend ->
if (attr.end > start) {
val destTxt = dest.toString()
val resultingTxt = (destTxt.substring(0, dstart)
+ source.subSequence(start, end)
) + destTxt.substring(dend)
if (!resultingTxt.matches(
Regex(
"^\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3}(:(\\d{1,5})?)?)?)?)?)?)?)?"
)
)
)
return@InputFilter ""
}
null
}
}