2010-07-21 95 views
1

与FLEX4 AIR应用程序工作的TextInput不完整的价值,使用该组件我从条形码阅读器获取的数据,星火使用条码阅读器

<s:TextInput id="barcode" enter="showBarcode()"/> 

那么对于处理输入事件,当读者完成其读至极自动触发

private function showBarcode():void{ 
    Alert.show(barcode.text); 
} 

好的,很简单。但我的问题是:在警报框中显示的文本不完整,它没有输入一个或两个数字(最后一个),或者它只是显示TextInput组件中的整个文本(正确的视图)

我已经测试了我的BC阅读器记事本,而且很好。

我已经使用Flex3 web应用中的MX组件测试了相同的代码,并且没有问题。

一些帮助将不胜感激。

Tnx

回答

1

而不是使用“enter”尝试侦听onKeyUp事件。

您必须从条形码扫描仪中找出适当的行尾字符读入。但是,请关注这一点,并以这种方式进行警戒;否则什么都不做。

+0

我尝试使用keyUp =“showBarcode(event)”的建议。结果是一样的。 我相信这可能是一个与输入缓冲区有关的错误,我不知道。 Tnx – gustyaquino 2010-07-21 15:38:02

+1

有趣。很容易相信输入缓冲区是一个因素。您是否尝试过Flex 4 SDK中的mx:TextInput? – JeffryHouser 2010-07-21 16:14:59

+0

你实际上想要做keyDown,而不是keyUp(想想按住textInput中的一个键)。我们在许多机器上使用条形码扫描仪(监听条形码上的第一个字符ctrl-y,触发条形码管理器中的某些动作,成为显示列表的一部分......所有动作都完美无缺)。 – 2010-07-21 16:18:16

0

文本至少按照您在Spark TextInput中所期望的那样使用条形码阅读器使用相同的工作流程显示,如本视频中所示:“Flash Nicey Nice With HID”http://www.youtube.com/watch?v=sEw0RB-Uj00

无论如何,我不认为Adobe Flash播放器支持正式的其他HID设备,而不是键盘或鼠标。

因此,我不希望Adobe工程师在短时间内使Spark TextInput与您的条形码阅读器输入兼容。

+0

只是一个想法。 尝试侦听Spark TextInput的“更改”事件并在事件侦听器中检查最后一个文本字符是否为Keyboard.ENTER符号>这将表示从条形码读取器读取整个文本。 – JabbyPanda 2010-07-22 14:42:02

+0

BC阅读器充当普通键盘,完美地听取mx:TextInput和s:TextInput上的“输入”事件,问题仅与Spark组件的输入数据有关,它表现奇怪,数据相同在任何事件发生后(即输入,更改,键盘上,...)立即显示在现场显示不可用(有时是部分)。 MX组件的工作原理与此有关。 – gustyaquino 2010-07-23 21:10:21

0

我在Flex 4/Spark的条码扫描工作中遇到了同样的问题。我们找到了两种解决方法。

第一个是使用旧的“Halo”TextInput控件(<mx:TextInput />)。即使在Flex 4项目中也可以做到这一点。

第二方法,是保持“星火”的TextInput控制,而是利用很短的计时器在你使用keyUp或keyDown事件让文本属性完全充满条形码扫描数据 - 这不是我我不确切知道这是为什么起作用,但确实如此。而且你可以保留Spark控件/蒙皮的所有优点。所以,楼主的例子可能是固定的,如果它变成了:

<s:TextInput id="barcode" keyDown="showBarcode(event)"/> 

private function showBarcode(evt:KeyboardEvent):void { 

    var t:Timer = new Timer(10, 1); // 10ms 
    t.addEventListener(TimerEvent.TIMER, function():void { 
     Alert.show(barcode.text); 
    }); 
    t.start(); 
} 

奖励:
如果你不想使用此定时器遍布在事件处理程序代码,你可以把它一个效用函数在Barcoder.as类,像这样:

public static function checkScan(evt:KeyboardEvent, callback:Function):void 
{ 
    if (evt.keyCode == Keyboard.ENTER) 
    { 
     var t:Timer = new Timer(10, 1); // 10 ms 
     t.addEventListener(TimerEvent.TIMER, function():void { callback(); }); 
     t.start(); 
    } 
} 

然后,如果你有两个独立的条码领域,具有两个独立的处理器(bc1_handler()bc2_handler())你的MXML会是这样的:

<s:TextInput id="barcode1" keyDown="Barcoder.checkScan(event, bc1_handler)" /> 
<s:TextInput id="barcode2" keyDown="Barcoder.checkScan(event, bc2_handler)" /> 
3

我们遇到了同样的问题,我们结束了保存字符从条形码接收扫描程序在缓冲区而不是访问TextInput文本属性。我们总是以正确的顺序接收字符,但是,使用Spark TextInput时,文本属性有时会混乱。

<s:TextInput id="barcode" keyDown="barcode_keyDownHandler(event)" /> 

这是我们所使用的缓冲区,这些都是相关的功能:

private var textBuffer:ArrayList = new ArrayList(); 

protected function getTextBufferContent():String 
{ 
    var content:String=""; 
    for (var i:int = 0; i < textBuffer.length; i++) 
    { 
     content=content.concat(textBuffer.getItemAt(i)); 
    } 
    return content; 
} 

protected function handleKeyboardEnter():void 
{ 
    var barcodeScan:String=getTextBufferContent(); 
    textBuffer.removeAll(); 
    if (barcodeScan != "") 
    { 
     Alert.show(barcodeScan); 
    } 
} 

protected function barcode_keyDownHandler(event:KeyboardEvent):void 
{ 
    trace("barcode_keyDownHandler: " + event.keyCode + " " + String.fromCharCode(event.keyCode));    
    if (event.keyCode == Keyboard.ENTER) 
    { 
     handleKeyboardEnter(); 
    } 
    else textBuffer.addItem(String.fromCharCode(event.keyCode)); 
} 

的MX:的TextInput也工作过,但我们想保持Spark组件。