CordovaWebView не работает с методом onBackPressed в Android

#java #android #cordova

#java #Android #кордова

Вопрос:

Как говорится в названии CordovaWebView , и onBackPressed в Android в сочетании дают странные результаты. У меня гибридное приложение. Моя основная деятельность имеет DrawerLayout и CordovaWebView . Мой onBackPressed:

  @Override

public void onBackPressed(){
  if(drawerIsOpen){
    //close drawer
  }else if(webviewIsIn){
     //hide webview
  }else{
     super.onBackPressed();
  }
}
  

Когда я использую android WebView , переопределенный метод вызывается, как и ожидалось. И когда я переключусь на CordovaWebView метод, он даже не будет вызван, вместо этого будет вызван native onBackPressed .
Я пробовал переопределять onKeyDown , onKeyUp но это дает мне тот же результат, методы просто не вызываются.
Я использую Cordova 2.9.0, а тестируемое устройство — Galaxy Note 2, Android jellybean 4.2.2
DrawerLayout имеет функцию закрытия при обратном нажатии, которую я только что отключил.
Я надеюсь, что вы, ребята, понимаете проблему.

Ответ №1:

Я столкнулся с той же проблемой. Мое решение состояло в том, чтобы извлечь CordovaWebView и переопределить public boolean onKeyUp(int keyCode, KeyEvent event) что-то вроде этого (для Cordova 3.4.0 код является частью CordovaWebView.onKeyUp(int, KeyEvent) ):

 public class CustomCordovaWebView extends CordovaWebView {

    protected View mCustomView;

    protected boolean bound;

    public CustomCordovaWebView(final Context context) {
        super(context);
    }

    public CustomCordovaWebView(final Context context, final AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomCordovaWebView(final Context context, final AttributeSet attrs, final int defStyle) {
        super(context, attrs, defStyle);
    }

    @TargetApi(11)
    public CustomCordovaWebView(final Context context, final AttributeSet attrs, final int defStyle, final boolean privateBrowsing) {
        super(context, attrs, defStyle, privateBrowsing);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        // If back key
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            // A custom view is currently displayed  (e.g. playing a video)
            if (mCustomView!=null){
                this.hideCustomView();
            }else{
                // The webview is currently displayed
                // If back key is bound, then send event to JavaScript
                if (this.bound) {
                    this.loadUrl("javascript:cordova.fireDocumentEvent('backbutton');");
                    return true;
                } else {
                    // If not bound
                    // Go to previous page in webview if it is possible to go back
                    if (this.backHistory()) {
                        return true;
                    }
                    // If not, then invoke default behavior
                    else {
                        //this.activityState = ACTIVITY_EXITING;
                        //return false;
                        // If they hit back button when app is initializing, app should exit instead of hang until initialization (CB2-458)
                        // this.cordova.getActivity().finish();
                        // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this thing is closing your activity in CordovaWebView
                    }
                }
            }
        } else {
            return super.onKeyUp(keyCode, event);
        }

        return false;
    }

    @Override
    public void hideCustomView() {
        mCustomView = null;
        super.hideCustomView();
    }

    @Override
    public void showCustomView(final View view, final WebChromeClient.CustomViewCallback callback) {
        mCustomView = view;
        super.showCustomView(view, callback);
    }

    @Override
    public void bindButton(final boolean override) {
        bound = override;
        super.bindButton(override);
    }
}
  

Если есть лучшее решение, я был бы заинтересован в нем.

Комментарии:

1. К сожалению, этот ответ не решает мою проблему.

2. Мой фрагмент был для Cordova 3.4.0, поэтому простое повторное использование, вероятно, не будет работать на 2.9.0. Пожалуйста, попробуйте проверить исходные коды 2.9.0 CordovaWebView, чтобы адаптировать этот подход. Я могу проверить это сам позже, но у меня, вероятно, все равно не будет возможности его протестировать.

3. Я изменил в соответствии с моими потребностями. Интересно то, что при вызове clearHistory в cord web view ошибка, похоже, появляется не так часто. Спасибо, что помогли мне.

4. больше не поддерживает 5.1.1, поскольку CordovaWebView — это интерфейс, а не класс.