CodenameOne文本字段关注Android

hxzsmxv2  于 2023-01-15  发布在  Android
关注(0)|答案(2)|浏览(123)

我有一个文本字段“条形码”和一个文本区域“条形码列表”。
在启动时,我想将焦点设置在“条形码”字段上。我的Android扫描仪就像键盘一样工作,成功扫描到这个字段。
当“条形码”文本字段更改时,我想将内容添加到“条形码列表”文本区域,然后将焦点重新设置为“条形码”字段,以准备下一次扫描。
问题是,这在模拟器中有效,但在Android设备上无效。在设备上(Unitech HT730),扫描的数据被添加到“条形码”字段,然后被复制到“条形码列表”,但是焦点没有返回到“条形码”字段。 Flink 的光标出现在最右边的字段中,但是我无法扫描(或键入)到这个字段中。一旦我触摸该字段,光标就会跳到最左边,我就能够再次扫描或键入该字段。
我试过在调用requestFocus()之前插入sleep(100)。我也试过使用repaint()。唯一有用的是删除对clear()的调用。看起来clear()除了“Barcode”文本内容之外,还必须处理其他内容,但我找不到任何其他方法来清除Barcode内容:即使setText(“”)也不起作用。
下面是我正在使用的代码片段:

gui_Barcode_t.addDataChangeListener((i1, i2) -> {           
    String s1 = gui_Barcode_t.getText();
    
    // A DataChange event will fire after the field is cleared, so test to see if this has occurred.
    if (s1.length()> 0) {           
        List_s += s1 + "\n";

        gui_BarcodeList_ta.requestFocus();
        gui_BarcodeList_ta.setText(List_s);
        sleep(100);            
        gui_BarcodeList_ta.repaint();
    } else {
        // This works in sim: repaint(), sleep(100), requestFocus()
        gui_Barcode_t.repaint();
        sleep(100);            
        gui_Barcode_t.requestFocus();
        return;
    }

    // Note that a DataChange event will fire after the field is cleared.
    // This works in sim: clear(), sleep(100), repaint(), sleep(100), requestFocus().
    // This works on Android device if clear() is removed, but the text field is not cleared.
    gui_Barcode_t.clear();
    sleep(100);
    gui_Barcode_t.repaint();
    sleep(100);            
    gui_Barcode_t.requestFocus();
});
jjhzyzn0

jjhzyzn01#

requestFocus()非常适合聚焦,但它可能会与本机编辑冲突,这是一个不同的过程。
您要使用的是startEditingAsync()到,如果可能编辑了错误的字段,则可能使用stopEditing()
作为旁注,除非你正在构建一个自定义组件,否则你不应该发出repaint()调用。你应该永远在EDT上调用sleep。这是一个严重的bug!

8tntrjer

8tntrjer2#

谢谢,Shai。显然我在CNO和移动的GUI开发方面是个新手。
除了在startEditingAsync()和startEditingAsync()中 Package 文本编辑之外,我还必须在datachanged事件处理程序之外处理这些编辑。

public void onBarcode_tDataChangeEvent(com.codename1.ui.Component cmp, int type, int index) {
    BarcodeDataChangedFired = true;
}

task = new TimerTask() {        
    // run() method to carry out the action of the task
    public void run() {          
    if (BarcodeDataChangedFired) {
            BarcodeDataChangedFired = false;
            
            String s1 = gui_Barcode_t.getText();

            // If this event was fired because of the gui_Barcode_ta.setText(" ")..
            if (s1.length() < 1) { 
                // Set focus back to the barcode field.
                gui_Barcode_t.startEditingAsync();
                //gui_BarcodeList_ta.stopEditing(); // THIS PREVENTS THE TEXTCHANGE FROM FIRING!
                return;
            }

            // Play a sound to indicate that the barcode was read.
            PlayMP3("bell4.wav");

            // Copy the new barcode into the barcode list.
            gui_BarcodeList_ta.startEditingAsync();
            gui_BarcodeList_ta.setText(s1);
            gui_BarcodeList_ta.stopEditing();

            // Clear the barcode field.
            gui_Barcode_t.startEditingAsync();
            // This is the only way to clear the TextArea, and it will fire the DataChanged event.
            gui_Barcode_t.clear();
            gui_BarcodeList_ta.stopEditing();
        }
    }
};

相关问题