Java me 当虚拟键盘隐藏时,如何从LWUIT文本字段中移除焦点并正确调整窗体大小?

Java me 当虚拟键盘隐藏时,如何从LWUIT文本字段中移除焦点并正确调整窗体大小?,java-me,lwuit,nokia-s40,lwuit-form,lwuit-textfield,Java Me,Lwuit,Nokia S40,Lwuit Form,Lwuit Textfield,我在LWUIT的文本字段中遇到了一个问题 在我的一些表单中,我显示一个类别栏,而在其他表单中,我将其隐藏 在我使用的一些表单中,当我关注其中一个表单并使虚拟键盘(VKB)出现时,问题就会出现。当出现VKB时,屏幕组件会调整自身大小,以适应输入文本时可见的Textfield,但当我通过VKB上的后退按钮或返回键隐藏VKB时,Textfield会保持焦点,不仅如此,当屏幕组件自行调整大小时,当前可见的表单会自行调整大小,就像没有类别栏一样,因此表单底部的所有组件都会被类别栏隐藏 通过显示另一个表单(

我在LWUIT的文本字段中遇到了一个问题

在我的一些表单中,我显示一个类别栏,而在其他表单中,我将其隐藏

在我使用的一些表单中,当我关注其中一个表单并使虚拟键盘(VKB)出现时,问题就会出现。当出现VKB时,屏幕组件会调整自身大小,以适应输入文本时可见的Textfield,但当我通过VKB上的后退按钮或返回键隐藏VKB时,Textfield会保持焦点,不仅如此,当屏幕组件自行调整大小时,当前可见的表单会自行调整大小,就像没有类别栏一样,因此表单底部的所有组件都会被类别栏隐藏

通过显示另一个表单(包括PopupChoiceGroupDatePicker)然后返回到类别栏所涵盖的表单来解决此问题

在没有可见的类别栏的其他表单中,有时显示VKB时的调整会导致表单自身调整大小,就好像类别栏是可见的一样,从而可以在不可用时与之交互

如何确保焦点完全丢失在文本字段上?另外,无论类别栏是否可见,如何确保表单的大小正确调整

编辑

我一直在挖掘TextFieldFormVKB的类参考,在后面的部分中,我发现了一个名为autoAdjust的方法,根据文档:

自动调整对话框的大小。此方法是从 sizeChanged事件

sizeChanged方法听起来像是我应该检查的东西,在表格中对该方法的描述是:

此方法仅在窗体的基础画布 获取大小已更改的事件。此方法将触发 形式。仅当此表单为 当前形式

这个方法看起来像是我正在寻找的用于调整大小的回调,因此我对它进行了重写,并放置了一个NotificatioBar,以显示调用该方法时发送的宽度和高度值

在我的设备上测试后,我发现当显示或隐藏VKB后调整表单大小时,高度值有时不是270(显示CategoryBar时表单的高度),而是作为320发送(全屏高度,好像没有显示任何类别栏

到目前为止,我还无法理解为什么表单会忽略这样一个事实,即在调整自身大小时,类别栏是否正在显示

我试图在sizeChanged方法中更改表单高度,但表单没有受到影响。在我看来,我必须修改的是绘制表单的画布,但我并不确定,因为画布隐藏在LWUIT中


是否是绘制我的表单的画布出了问题?是什么引发了这种行为?

目前,我找到了一种解决方法,以避免CategoyBar隐藏我的组件,因为表单在VKB隐藏后错误地调整了大小,在这种情况下,表单错误地调整了大小并显示了CategoryBar(如果调用它的setVisibility方法并传递false,我不知道为什么它是可见的)

首先,我覆盖了sizeChanged方法:

protected void sizeChanged(int w, int h){
    if(h > 270){
        mainContainer.getStyle().setMargin(Component.BOTTOM, 50);
    }
    else{
        mainContainer.getStyle().setMargin(Component.BOTTOM, 0);
    }
}
我检查高度值,如果该值大于显示CategoryBar时的预期高度,那么我将容器底部设置为50,以便它可见

但这还不够,因为如果我再次显示相同的表单并正确调整其大小,那么容器将保持底部50。因此我也重写了onShow方法:

protected void onShow(){
    int containerBottom = mainContainer.getStyle().getMargin(Component.BOTTOM);
    if(this.getHeight() == 270 && containerBottom == 50){
        mainContainer.getStyle().setMargin(Component.BOTTOM, 0);
    }
}
我必须确保如果高度是270,容器底部是50,那么容器底部应该是0

因为我还没有找到一种方法来避免我的表单调整大小,当它根本不应该显示时,显示我的分类栏,我不认为自己有一个完整的答案。如果我找到解决办法,我会更新。

编辑

我尝试通过调用每个表单的onShow方法中的setVisibility方法来显式设置显示/隐藏状态。到目前为止,我已经能够避免以前遇到的视觉问题。我不确定这个问题是由于Lwit还是由于J2ME限制,但我就是这样解决的