在我的 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/