使用条形码阅读器Spark TextInput不完整的值

时间:2010-07-21 15:06:56

标签: flex air

使用Flex4 AIR应用程序,使用此组件从条形码阅读器获取数据

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

然后处理enter事件,当读者完成阅读时会自动触发

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

好的,非常简单。但我的问题是:警告框中显示的文本不完整,它错过了一个或两个数字(最后一个)或它只是显示TextInput组件中的整个文本(正确的视图)

我已经使用记事本测试了我的BC阅读器,没关系。

我在Flex3网络应用中使用MX组件测试了相同的代码,没有问题。

一些帮助将不胜感激。

Tnx

4 个答案:

答案 0 :(得分:3)

我们遇到了同样的问题,我们最终将条形码扫描器收到的字符保存在缓冲区中,而不是访问TextInput文本属性。我们总是以正确的顺序收到字符,但是使用Spark TextInput,text属性有时会被扰乱。

<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组件。

答案 1 :(得分:1)

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

您必须从条形码扫描仪中找出适当的行尾字符读入。但是,只需键入并以此方式提醒您;否则什么也不做。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

我在Flex 4 / Spark中使用条形码扫描遇到了同样的问题。我们发现有两种解决方法。

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

第二方法是保持“Spark”TextInput控件,但是在keyUp或keyDown事件中使用一个非常短的Timer来让text属性完全用条形码扫描数据填充 - 我不确切知道为什么会这样,但确实如此。并且您可以保留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();
}

奖金:
如果你不想在事件处理程序中的代码中使用这个Timer,你可以在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)" />