使用Flex4 AIR应用程序,使用此组件从条形码阅读器获取数据
<s:TextInput id="barcode" enter="showBarcode()"/>
然后处理enter事件,当读者完成阅读时会自动触发
private function showBarcode():void{
Alert.show(barcode.text);
}
好的,非常简单。但我的问题是:警告框中显示的文本不完整,它错过了一个或两个数字(最后一个)或它只是显示TextInput组件中的整个文本(正确的视图)
我已经使用记事本测试了我的BC阅读器,没关系。
我在Flex3网络应用中使用MX组件测试了相同的代码,没有问题。
一些帮助将不胜感激。
Tnx
答案 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)" />