7.2 返回键功能的处理
用App Inventor2开发的App,组件都是依附在Screen上,用户点击按键,也是Screen先接收按键事件,对于返回键的处理代码如下(在Form.java中):
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (!BackPressed()) {
boolean handled =super.onKeyDown(keyCode, event);
AnimationUtil.ApplyCloseScreenAnimation(this, closeAnimType);
return handled;
} else {
return true;
}
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onStop() {
super.onStop();
Log.i(LOG_TAG, "Form " + formName + " got onStop");
for (OnStopListener onStopListener : onStopListeners) {
onStopListener.onStop();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// for debugging and future growth
Log.i(LOG_TAG, "Form " + formName + " gotonDestroy");
// Unregister events for components in this form.
EventDispatcher.removeDispatchDelegate(this);
for (OnDestroyListener onDestroyListener : onDestroyListeners) {
onDestroyListener.onDestroy();
}
}
当点击返回键的时候,会关闭当前App的Screen,退出应用,返回到系统桌面。
在用Web浏览框浏览网页的时候,这样处理的用户体验非常糟糕:用户在查看完第三级网页的时候,想再看下第二级网页,结果一点击返回键,直接就退出应用了。
可以在Form.java中,对Web浏览框的情况做特殊处理,代码如下:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
//判断是否可以返回上一级网页,如果可以则调用Web浏览框的goBack函数;如果不能再返回,则执行原有代码。
if (WebViewer.isCanGoBack()) {
WebViewer.goBack();
return true;
}
if (!BackPressed()) {
boolean handled =super.onKeyDown(keyCode, event);
AnimationUtil.ApplyCloseScreenAnimation(this, closeAnimType);
return handled;
} else {
return true;
}
}
return super.onKeyDown(keyCode, event);
}
在WebViewer.java中增加两个静态函数,供Form.java调用:
public static boolean isCanGoBack() {
return webview.canGoBack();
}
public static void goBack() {
webview.goBack();
}