2 votes

Android phonegap et le menu se bloque avec webview

Je suis confronté à un problème étrange avec mon application :

En appuyant sur le bouton de menu, mon application se plante. MAIS ! seulement quand je lance l'application en webview !

cela fonctionne :

super.loadUrl("http://www.url.com");

Le menu se charge ici et tout va bien, mais comme je n'arrive pas à faire fonctionner "shouldOverrideUrlLoading" avec super.loadurl, j'essaie de lancer l'application directement dans webview.

mwebview.loadurl("http://url.com"); fait le travail mais si j'appuie sur le bouton menu, il se plante.

mon menu est créé de manière programmatique comme suit :

 @Override
        public boolean onCreateOptionsMenu(Menu menu) {
        //Menu that appears when menu button is pressed on device
         Menu m_menu = menu;
         m_menu.add(Menu.NONE, Menu.FIRST+6, 0, "Hjem");
         m_menu.add(Menu.NONE, Menu.FIRST+7, 0, "Om");
         m_menu.add(Menu.NONE, Menu.FIRST+5, 0, "Avslutt");
         return super.onCreateOptionsMenu(menu);
        }

Voici mon activité :

 @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        super.setBooleanProperty("loadInWebView", true); 
        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setBuiltInZoomControls(false);
        mWebView.requestFocusFromTouch();
        mWebView.setWebViewClient(new HelloWebViewClient());
        mWebView.setWebChromeClient(new WebChromeClient());

           getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
            WindowManager.LayoutParams.FLAG_FULLSCREEN | 
            WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
            super.setIntegerProperty("splashscreen", R.drawable.splash);
            super.setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            super.loadUrl("http://www.url.com/app/index");
//mWebView.loadurl("url");
            }
        private class HelloWebViewClient extends WebViewClient {
             @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

        }

Voici l'erreur dans le catlog :

03-03 10:00:26.893: E/AndroidRuntime(350): FATAL EXCEPTION: main
03-03 10:00:26.893: E/AndroidRuntime(350): java.lang.NullPointerException
03-03 10:00:26.893: E/AndroidRuntime(350):  at com.phonegap.DroidGap.postMessage(DroidGap.java:943)
03-03 10:00:26.893: E/AndroidRuntime(350):  at com.phonegap.DroidGap.onCreateOptionsMenu(DroidGap.java:1374)
03-03 10:00:26.893: E/AndroidRuntime(350):  at blogreel.app.HelloAppActivity.onCreateOptionsMenu(HelloAppActivity.java:44)
03-03 10:00:26.893: E/AndroidRuntime(350):  at android.app.Activity.onCreatePanelMenu(Activity.java:2148)
03-03 10:00:26.893: E/AndroidRuntime(350):  at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:305)
03-03 10:00:26.893: E/AndroidRuntime(350):  at com.android.internal.policy.impl.PhoneWindow.onKeyDownPanel(PhoneWindow.java:550)
03-03 10:00:26.893: E/AndroidRuntime(350):  at com.android.internal.policy.impl.PhoneWindow.onKeyDown(PhoneWindow.java:1192)
03-03 10:00:26.893: E/AndroidRuntime(350):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1648)
03-03 10:00:26.893: E/AndroidRuntime(350):  at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2471)
03-03 10:00:26.893: E/AndroidRuntime(350):  at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2441)
03-03 10:00:26.893: E/AndroidRuntime(350):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1735)
03-03 10:00:26.893: E/AndroidRuntime(350):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-03 10:00:26.893: E/AndroidRuntime(350):  at android.os.Looper.loop(Looper.java:123)
03-03 10:00:26.893: E/AndroidRuntime(350):  at android.app.ActivityThread.main(ActivityThread.java:4627)
03-03 10:00:26.893: E/AndroidRuntime(350):  at java.lang.reflect.Method.invokeNative(Native Method)
03-03 10:00:26.893: E/AndroidRuntime(350):  at java.lang.reflect.Method.invoke(Method.java:521)
03-03 10:00:26.893: E/AndroidRuntime(350):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-03 10:00:26.893: E/AndroidRuntime(350):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-03 10:00:26.893: E/AndroidRuntime(350):  at dalvik.system.NativeStart.main(Native Method)

Je demande donc : Y a-t-il un moyen de faire fonctionner mon menu lors du chargement direct dans la webview ? Ou pour que "Shouldoverrideurl" fonctionne sur toutes les urls en utilisant "super.loadurl".

modifier Je dois ajouter que la première page que super.loadurl charge fonctionne. l'url spécifiée contient des liens qui, lorsqu'on clique dessus, redirigent dans la même vue web. cependant, les liens de la deuxième page se déclenchent dans un nouveau navigateur.

Tout conseil est le bienvenu :)

4voto

darryn.ten Points 2524

Voici comment j'ai réussi à ajouter le support des boutons de menu aux projets PhoneGap et Android Webview ordinaires

//basic menu button support
@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    super.onCreateOptionsMenu(menu);
    MenuItem item = menu.add("Refresh");
    item = menu.add("Quit");
    return true;
}

//handle menu item selection
public boolean onOptionsItemSelected(MenuItem item)
{
    if (item.hasSubMenu() == false)
    {
        if("Quit"==item.getTitle()) {
            finish();
        }
        if("Refresh"==item.getTitle()) {
           super.loadUrl("file:///android_asset/www/index.html");
        }
    }
    return true;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X