如何从LWUIT Textfield中删除焦点并在虚拟键盘隐藏时正确调整表单大小?

时间:2014-09-03 15:31:20

标签: java-me lwuit nokia-s40 lwuit-form lwuit-textfield

我遇到了LWUIT Textfield 的问题。

在我的某些表单中,我显示 CategoryBar ,而在其他表单中我隐藏了它。

在某些表单中,我有文本字段,当我专注于一个表格并显示虚拟键盘(VKB)时,问题就出现了。当出现 VKB 时,屏幕组件会自行调整大小以调整文本字段,以便在输入文本时可见,但是当我隐藏 VKB 时,无论是通过后退按钮还是 VKB 上的返回键,文本字段都会保留焦点,不仅如此,当屏幕组件自行调整大小时,当前可见< strong>表单会自行调整大小,就像没有 CategoryBar 一样,因此表单底部的所有组件都被 CategoryBar隐藏

通过显示另一个表单(包括 PopupChoiceGroup DatePicker )然后返回到表单来解决此问题。的 CategoryBar 即可。

在其他未显示 CategoryBar 的表单中,有时在显示 VKB 时调整大小会导致表单自行调整大小,就像 CategoryBar 是可见的,当它不可用时,可以与它进行交互。

如何确保文本字段上的焦点完全丢失?此外,如果 CategoryBar 是否可见,如何确保正确调整表单的大小?

修改

我一直在挖掘 TextField 表单 VKB 的类引用,后来我发现了一个名为 autoAdjust 根据文档:

  

自动调整对话框的大小。这个方法是从a触发的    sizeChanged 事件。

方法 sizeChanged 听起来像我应该检查的内容,在表单的引用中,此方法的描述是:

  

此方法仅在表单的基础画布时调用   得到一个尺寸改变的事件。此方法将触发重新布局   形成。只有在此表单为的情况下,此方法才会获得回调   目前的表格

这个方法好像是我正在寻找的调整大小的回调,所以我覆盖它并放置一个 NotificatioBar 来显示调用该方法时发送的宽度和高度值。

我在设备上测试后发现的是,在显示或隐藏 VKB 后调整表单大小时,高度值有时而不是 270 (显示 CategoryBar 时表单的高度)它被发送为 320 (全屏高度,好像没有 CategoryBar 是正在展示。)

到目前为止,我还没有理解为什么在调整自身大小时,Form会忽略 CategoryBar 的显示或不显示的事实。

我尝试在 sizeChanged 方法中更改表单高度,但表单并未受其影响。在我看来,我需要修改的是绘制Form的画布,但我不确定,因为画布隐藏在LWUIT中。

可能是我的表单被绘制的画布是错误的吗?是什么引发了这种行为?

1 个答案:

答案 0 :(得分:1)

目前我找到了一个解决方法,以避免我的组件被CategoyBar隐藏,因为在VKB隐藏后表单错误地重新调整了窗体,因为Form错误地调整了大小并显示了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时的预期高度,那么我将Container的底部设置为50,这样它就可见了。

但这还不够,因为如果我再次显示相同的形式并且它正确调整大小,那么Container将保持在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,那么Container的底部应该是0.

由于我还没有找到办法避免让我的表格调整大小并显示不应该显示的CategoryBar,我不会认为自己有完整的答案。如果我找到解决方法,将会更新。

修改

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