3

我遇到了 LWUIT 的Textfield的问题。

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

在我有Textfields的某些表单中,当我专注于一个表单并使虚拟键盘(VKB) 出现时,问题就会出现。当VKB出现时,屏幕组件会自行调整大小以适应Textfield在输入文本时可见,但是当我通过 VKB 上的后退按钮或返回键隐藏VKB Textfield仍然保持焦点,不仅如此,当屏幕组件调整自己的大小时,当前可见的Form也会调整自己的大小,就好像没有CategoryBar存在一样,所以任何位于Form底部的组件CategoryBar隐藏。

这可以通过显示另一个 Form(这包括PopupChoiceGroupDatePicker)然后返回到CategoryBar覆盖的Form来解决。

在没有CategoryBar可见的其他 Forms 中,有时在显示VKB时调整大小会导致 Forms 调整自己的大小,就好像CategoryBar是可见的,从而可以在它不应该可用时与之交互。

如何确保焦点完全丢失在Textfield上?此外,无论CategoryBar是否可见,如何确保正确调整 Form 的大小?

编辑

我一直在挖掘TextFieldFormVKB的类引用,后来我发现了一个名为autoAdjust的方法,根据文档:

自动调整对话框的大小。此方法由 sizeChanged事件触发。

方法sizeChanged听起来像是我应该检查的东西,在Form的参考中,该方法的描述是:

仅当表单的底层画布获得大小更改事件时,才会调用此方法。此方法将触发表单的重新布局。仅当此表单为当前表单时,此方法才会获取回调

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

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

到目前为止,我还无法理解为什么 Form 在调整自身大小时会忽略CategoryBar是否正在显示的事实。

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

难道是我的表格正在绘制的画布是错误的吗?是什么引发了这种行为?

4

1 回答 1

1

目前,我找到了一种解决方法来避免我的组件被 CategoyBar 隐藏,因为在 VKB 隐藏后 Form 调整大小错误,对于 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,那么容器的底部应为 0。

由于我还没有找到一种方法来避免让我的表单在根本不应该显示的情况下调整大小并显示 CategoryBar,所以我认为自己没有完整的答案。如果我找到解决方法,将更新。

编辑

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

于 2014-09-10T17:01:38.057 回答