1. 程式人生 > >AI開發實戰9-Web瀏覽框(WebView)的定製2

AI開發實戰9-Web瀏覽框(WebView)的定製2

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();

 }