Codenameone 代号1-正确使用选择器

Codenameone 代号1-正确使用选择器,codenameone,Codenameone,我正试图就选择器的使用提出一个明确的问题,因为我在上一篇文章中的问题不够明确: 选择器的目的是从一个集合中选择一个元素,例如一组字符串中的一个字符串,对吗?因此,我想让用户有机会从一组字符串中选择一个字符串,每个字符串对应一种语言 问题是添加到选择器中的ActionListener的使用在这方面是不正确的,因为它是由“Ok”和“Cancel”按钮触发的 我只需要在用户按“Ok”时执行一些代码(更改语言),因为在用户按“Cancel”时执行这些代码应该被视为意外行为和错误(从用户的角度来看) 因此

我正试图就选择器的使用提出一个明确的问题,因为我在上一篇文章中的问题不够明确:

选择器的目的是从一个集合中选择一个元素,例如一组字符串中的一个字符串,对吗?因此,我想让用户有机会从一组字符串中选择一个字符串,每个字符串对应一种语言

问题是添加到选择器中的ActionListener的使用在这方面是不正确的,因为它是由“Ok”和“Cancel”按钮触发的

我只需要在用户按“Ok”时执行一些代码(更改语言),因为在用户按“Cancel”时执行这些代码应该被视为意外行为和错误(从用户的角度来看)


因此,我的问题是如何在这个用例中正确使用选择器。

从CN1文档中,一种方法是:

String [] list = {"one" , "two" , "three"};
Picker picker = new Picker ();
picker.setType(Display.PICKER_TYPE_STRINGS);
picker.setStrings(list);
picker.setSelectedString("test");

picker.addActionListener(l -> System.out.println(picker.getSelectedString()));
奇怪的是,正如Francesco在前面指出的,当您在模拟器中运行应用程序,并按下选择器中的Cancel按钮时,它会打印出所选的字符串。按下“确定”按钮时也是如此。(这是有意的吗?)


在已安装的设备上,结果似乎好坏参半,因为在某些设备上,取消操作在任何操作中都不会发生

我必须这样做,以避免在按下“取消”时触发字符串上的另一个侦听器(我正在使用一个属性和一个更改侦听器),并且我通过检查当前选择器字符串与以前选择的字符串,以查看它是否更改来完成此操作。我仅在值更改时更新字段或局部变量(在我的示例中为属性)。修改上一个答案的代码:

...
private String currentSelection;
...

String [] list = {"one" , "two" , "three"};
Picker picker = new Picker ();
picker.setType(Display.PICKER_TYPE_STRINGS);
picker.setStrings(list);
picker.setSelectedString("test");

picker.addActionListener(l -> {
   if (!picker.getSelectedString.equals(currentSelection) {
      currentSelection = picker.getSelectedString;
      System.out.println(currentSelection);
   }
});

谢谢,但我需要在真实设备上保持一致的行为,因为我只需要在用户按“Ok”时执行一些代码(更改语言),因为在用户按“Cancel”时执行这些代码应该被视为意外行为和错误(从用户的角度看)。任何解决方法或技巧(即使使用与选择器组件不同但对本用例有用的东西)?操作侦听器只应在“确定”或用户单击条目时发生。如果它发生在按下cancel时,或者当用户在picker UI外部按下以关闭该UI时,那就是一个bug。在这种情况下,我们需要这个错误发生的确切细节,包括完整的操作系统版本号,因为它在不同的操作系统版本之间差异很大。我已经在git中修复了它,这样当用户按下cancel时,ActionEvent就不再触发了。将在下一个服务器更新周五提供。非常感谢,史蒂文谢谢詹姆斯,但是看到史蒂文·汉纳对我的问题的评论,这应该是问题的真正解决方案。