BlackBerry java检测屏幕前景事件

标签 blackberry java-me

在我的 BlackBerry 应用程序中,我有一个主屏幕。然后用户可以导航到设置屏幕。当用户回到主屏时,主屏上是否没有调用方法提示屏幕已经回到前台?

我试过 onFocus() 没有用。

谢谢!

最佳答案

不幸的是, Hook onExposed 是不够的。我发现在 Blackberry 中,对话框也是屏幕,甚至上下文菜单也是屏幕。它们被推到屏幕顶部,因此当它们被关闭时您会收到 onExposed 回调。

虽然在很多情况下它没问题,但在其他情况下它会带来问题 - 例如如果我必须仅在用户返回时刷新屏幕内容,而不是在菜单/对话框之后,那么我该怎么做?不幸的是,我的情况就是其中之一。

我没有找到检测“已覆盖”/“未覆盖”事件的记录方法。这是我的方法。 onCovered/onUncovered 当当前屏幕被应用的另一个屏幕覆盖/未覆盖时调用回调,但不是被对话框/菜单/虚拟键盘覆盖:

public class MyAppScreen extends MainScreen {
    private boolean isCovered;

    protected void onExposed() {
        Log.d("onExposed");
        super.onExposed();
        if (isCovered) {
            onUncovered();
            isCovered = false;
        }
    }

    protected void onObscured() {
        Log.d("onObscured");
        super.onObscured();
        final Screen above = getScreenAbove();
        if (above != null) {
            if (isMyAppScreen(above)) {
                isCovered = true;
                onCovered();
            }
        }
    }

    private boolean isMyAppScreen(final Screen above) {
        return (above instanceof MyAppScreen);
    }

    protected void onUncovered() {
        Log.d("onUncovered");
    }

    protected void onCovered() {
        Log.d("onCovered");
    }

    protected void onUiEngineAttached(final boolean attached) {
        if (attached) {
            Log.d("UI Engine ATTACHED");
        } else {
            Log.d("UI Engine DETACHED");
        }
        super.onUiEngineAttached(attached);
    }

    protected void onFocusNotify(final boolean focus) {
        if(focus){
            Log.d("focus GAINED");
        } else {
            Log.d("focus LOST");
        }
        super.onFocusNotify(focus);
    }
}

还有一个测试。尝试各种组合并查看您在日志中收到的事件。

public class TestLifecycle extends MyAppScreen implements FieldChangeListener {
    private final ABNTextEdit txt1;
    private final ButtonField btn1;
    private final ButtonField btn2;

    public TestLifecycle() {

        final Manager manager = getMainManager();

        txt1 = new ABNTextEdit();
        manager.add(txt1);

        btn1 = new ButtonField("Dialog", ButtonField.CONSUME_CLICK);
        btn1.setChangeListener(this);
        manager.add(btn1);

        btn2 = new ButtonField("Screen", ButtonField.CONSUME_CLICK);
        btn2.setChangeListener(this);
        manager.add(btn2);
    }

    public void fieldChanged(final Field field, final int context) {
        if (field == btn1) {
            Dialog.alert("Example alert");
        } else if (field == btn2) {
            UiApplication.getUiApplication().pushScreen(new TestLifecycle());
        }
    }
}

更新:

此方法有一个限制:如果在对话框或软键盘获得焦点时推送新屏幕,则当前屏幕将不会接收到onCovered/onUncovered 通知。

示例 A:如果您有一个固定大小的输入字段,并且在用户完成它时推送一个新屏幕,如果用户键入非常,您当前的屏幕将不会收到通知 很快。发生这种情况是因为在您调用 push(newScreen) 和它实际上被推送之间的那一刻,用户点击软 KB 上的一个字母并且它捕获了焦点。所以只有 onObscured 被调用,而不是 onCovered

解决方案:push(newScreen) 之前显式隐藏软键盘。

示例 B: 如果您有一个推送新屏幕然后自行关闭的自定义对话框,您当前的屏幕将不会收到通知。发生这种情况是因为您的自定义对话框未被识别为屏幕,因此仅调用 onObscured,而不调用 onCovered

解决方案:首先关闭返回结果值的对话框,让您的屏幕根据该值推送新屏幕。 - 或 - 覆盖 isMyAppScreen() 以返回 true 也用于您的自定义对话框。

关于BlackBerry java检测屏幕前景事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6470249/

相关文章:

audio - 在Blackberry的单个应用程序中禁用声音

黑莓代码签名垃圾邮件

Java,删除字符串对象中的反斜杠

java - J2ME 中的数组列表?

java - 使用 j2me 将捕获的图像保存到 sd 卡中

java - Symbian S60 第 5 版 LCDUI 中的按钮

blackberry - WebWorks Web Inspector - 意外响应代码 : 426

java - 将数据保存到黑莓内存中

java - 在 J2ME 中绘制透明弧线而不是图像?

java - java.awt.Window 的全屏问题