黑莓开发者大家好,
请告诉我如何验证用户输入的两个BasicEditField数据(myName应该长于2个字符; myFloat应该是> 10.0)并且:
以下是我非常简单的测试用例。它是一个完整的代码src \ mypackage \ MyApp.java,如果将其粘贴到JDE或Eclipse中,它将立即运行:
package mypackage;
import net.rim.device.api.system.*;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.ui.decor.*;
public class MyApp extends UiApplication {
public static void main(String args[]) {
MyApp myApp = new MyEdit();
myApp.enterEventDispatcher();
}
public MyApp() {
pushScreen(new MyScreen());
}
}
class MyScreen extends MainScreen {
MenuItem myItem = new MenuItem("Show my dialog", 0, 0) {
public void run() {
String[] buttons = { "Save", "Cancel" };
Dialog dialog = new Dialog("My dialog", buttons, null, 0, Bitmap.getPredefinedBitmap(Bitmap.INFORMATION));
EditField myNameField = new EditField("Name (must be > 2 chars): ", "",
TextField.DEFAULT_MAXCHARS, EditField.NO_NEWLINE);
dialog.add(myNameField);
BasicEditField myFloatField = new BasicEditField("Number: (must be > 10.0)", "",
5, EditField.FILTER_REAL_NUMERIC | EditField.EDITABLE);
dialog.add(myFloatField);
if (dialog.doModal() == 0) {
String myName = myNameField.getText();
float myFloat = 0.0f;
try {
myFloat = Float.parseFloat(myFloatField.getText());
} catch (NumberFormatException e) {
}
Status.show("Name: " + myName + ", Number: " + myFloat);
}
}
};
public MyScreen() {
setTitle(new LabelField("How to validate input?"));
addMenuItem(myItem);
}
}
在提出这个问题之前,我已经查看了TextFilter和Field.isDataValid(),但我仍然不确定如何在Blackberry中验证用户输入(相比之下,我对如何验证用户有一个非常清晰的图片使用Web表单在Web脚本中输入 - 使用jQuery / PHP / Perl / whatever)
谢谢! 亚历
答案 0 :(得分:2)
您可以通过在编辑字段上设置FieldChangeListener
来跟踪字段更改(使用setChangeListener()方法)。在每次更改(添加或删除的字母)时,都会通知侦听器,因此您可以获取最新的编辑字段文本并根据任何规则对其进行验证。
将包含错误数据的BasicEditField标记为红色
如果验证失败,您可以更改一些颜色变量(MyScreen的私有密码)并请求编辑字段失效(使用Field.invalidate()
),以便框架使用您刚刚设置的颜色重新绘制它。
阻止用户点击“保存”(或“确定”)按钮
使用Dialog
,您无法执行此操作。因此,您需要通过扩展net.rim.device.api.ui.container.PopupScreen
来创建自定义弹出屏幕。在此屏幕类中,您将按钮作为屏幕成员,因此您将能够从编辑字段更改侦听器访问它们。如果验证失败,您可以使用Field.setEnabled(boolean value)
禁用按钮。