sam*_*m_k 9 java validation android android-edittext
我必须允许用户只在##中输入时间:##格式即时编辑文本,有什么办法可以实现吗?我使用下面的代码,但它不起作用.
我能输入超过24的数字,如45623:5689.
edit.setInputType(InputType.TYPE_DATETIME_VARIATION_TIME)
Run Code Online (Sandbox Code Playgroud)
甚至android:text="time"也没有用.
我怎么能实现这个目标.任何人都可以建议我怎么做这件事.
我想允许用户输入前2个位置,最多23个值然后compulasary:然后用户可以允许最多59个值.
例如
23:59 correct
24:05 incorrect
02:56 correct
02:79 incorrect
Run Code Online (Sandbox Code Playgroud)
我也使用了这个自定义过滤器,但它不起作用
我从SO的其他地方得到了这个代码.
码:
InputFilter timeFilter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
int dstart, int dend) {
if (source.length() == 0) {
return null;// deleting, keep original editing
}
String result = "";
result += dest.toString().substring(0, dstart);
result += source.toString().substring(start, end);
result += dest.toString().substring(dend, dest.length());
if (result.length() > 5) {
return "";// do not allow this edit
}
boolean allowEdit = true;
char c;
if (result.length() > 0) {
c = result.charAt(0);
allowEdit &= (c >= '0' && c <= '2');
}
if (result.length() > 1) {
c = result.charAt(1);
allowEdit &= (c >= '0' && c <= '9');
}
if (result.length() > 2) {
c = result.charAt(2);
allowEdit &= (c == ':');
}
if (result.length() > 3) {
c = result.charAt(3);
allowEdit &= (c >= '0' && c <= '5');
}
if (result.length() > 4) {
c = result.charAt(4);
allowEdit &= (c >= '0' && c <= '9');
}
return allowEdit ? null : "";
}
};
Run Code Online (Sandbox Code Playgroud)
编辑问题:main.xml文件代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center"
android:orientation="horizontal" >
<TextView
android:id="@+id/txtRecipientName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="20dp"
android:text="@string/recipient_name" />
<EditText
android:id="@+id/edTxtRecipient"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10"
android:paddingLeft="20dp" >
<requestFocus />
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center"
android:orientation="horizontal" >
<TextView
android:id="@+id/txtParcelDeliverTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="20dp"
android:text="@string/delivered_time" />
<EditText
android:id="@+id/edTxtParcelDeliverTime"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10"
android:paddingLeft="20dp" >
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center"
android:orientation="horizontal" >
<Button
android:id="@+id/btnRecipient_OK"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="@android:string/ok" />
</LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
此代码正在运行,但如果我插入第一个字母并插入适当的值,那么它不起作用,因为source包含其先前的字符值.
尝试将字符转换为整数,然后测试它们是否大于 24 和 60。
int a = ((int) result.charAt(0)) - 48;
int b = ((int) result.charAt(1)) - 48;
int c = ((int) result.charAt(3)) - 48;
if(a < 0 || b < 0 || c < 0) {
Not right.
}
if((a > 2 || (a == 2 && b > 3)) || c > 59) {
Neither is this.
}
Run Code Online (Sandbox Code Playgroud)
负 48 因为数字 0 在 ascii 表中是第 48 位。测试必须是ascii。