9
votes

Crash d'application lorsque vous appuyez sur la touche MENU

J'essaie de créer une application pour Android et je suis tombé sur le problème suivant:

L'application se bloque dans un téléphone spécifique lorsque j'appuie sur le bouton Menu. Laissez-moi vous donner quelques détails d'abord. P>

  • Le bug survient uniquement sur LG Optimus L3 II E430 avec Android 4.1.2 (testé sur quatre autres téléphones jusqu'à présent) LI>
  • L'application commence par un écran éclabousseur et aucune barre d'action. À ce point, le bouton Menu ne fait rien. LI>
  • Avec une simple touche, nous passons devant l'écran de l'éclaboussure et nous allons à l'activité principale qui implémente une activité d'action et un tiroir de navigation. Li>
  • à partir de ce point et après, chaque fois que j'essaie de cliquer sur le bouton de menu, l'application se bloque. Li> ul>

    Voici la mise en page du menu et la fonction OncreateOptionsMenu: P>

    RES / MENU / MAIN.XML P>

    10-24 09:08:02.710    4712-4712/com.scaryboxstudios.unrealestateapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
        java.lang.NullPointerException
                at com.android.internal.policy.impl.PhoneWindow.onKeyUpPanel(PhoneWindow.java:1004)
                at com.android.internal.policy.impl.PhoneWindow.onKeyUp(PhoneWindow.java:1712)
                at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2125)
                at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3611)
                at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3581)
                at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2831)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:137)
                at android.app.ActivityThread.main(ActivityThread.java:4929)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
                at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
                at dalvik.system.NativeStart.main(Native Method)
    


3 commentaires

Problème trouvé déposé contre les bibliothèques de soutien: code.google.com/p/android / Problèmes / Détails? ID = 78154


@TalkLittle remercie! Je vais garder un œil sur ça!


Même problème sur lg l9 avec 4.1.2


3 Réponses :


2
votes

mise à jour: avec AppCompat-V7 version 22.0.0, OnKeyUp ne semble pas tirer pour la clé de menu. Le bug d'origine semble être corrigé, donc je vais probablement supprimer le contournement du sous-menu. Malheureusement, je n'ai pas vérifié le correctif sur un périphérique LG 4.1 affecté.


J'ai fini par faire une solution de contournement pour cela, que les utilisateurs signalent des rapports ont fixé le problème pour eux.

Implémentez des sous-menus au lieu de s'appuyer sur le menu de débordement. La mise en garde à ceci est que maintenant chaque appareil verra le bouton de trop-plein dans la barre d'action même s'ils ont une clé de menu.

La technique suivante provient de https://stackoverflow.com/a/18530179/57490

  1. Convertissez tous les éléments de menu Options de débordement aux sous-menus.

  2. remplacement OnKeyUp dans vos activités, avez-vous appeler menu.performidIdidIflow (r.id.menu_overflow, 0); et n'appelle pas super .Onkeyup pour KeyCode == KeyCode_Menu .


1 commentaires

Merci pour votre conversation Talklittle. Ce que vous avez dit est vrai bien sûr, mais je n'ai pas besoin d'une solution de contournement. En fait, il est possible de remplacer la bonne chose que je pensais. Le problème principal est de trouver la racine de ce problème et une solution correcte de le réparer. Pas un moyen de l'éviter !!



0
votes

Après avoir trébuché sur le même problème récemment, j'ai trouvé la racine du problème. Le problème concerne les problèmes de compatibilité entre les bibliothèques de soutien plus anciennes et les plus récentes. Il semble que j'ai utilisé des trucs amortis autour de mon code avec des choses plus récentes.

Je suis désolé d'être un peu abstrait, mais cette question est de 4 mois et je ne me souviens plus que ce sont exactement les lignes de code incorrectes. Si la mémoire sert à droite, le problème a menti sur des méthodes générées automatiquement à partir de Studio Android pour les activités de tiroir d'applications. J'ai utilisé le modèle de projet d'application de tiroir depuis Android Studio et j'ai choisi de supporter des API très anciennes Android afin que Android Studio a choisi la bibliothèque de support Android dépréciée.

Le point est que j'ai résolu le problème lorsque j'ai refacturé le code d'utiliser uniquement des techniques non amorties.

Si vous vous battez sur un problème similaire, je vous recommande vivement de supprimer tout ce que Android Studio (je suppose que vous utilisez Android Studio ou Eclipse) comme amorti.


0 commentaires

0
votes

Aussi pour attraper le bouton de menu peut utiliser Suivant:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) {


        // TODO - Your user code

        /*
        if (event.getAction() == KeyEvent.ACTION_DOWN
                && event.getRepeatCount() == 0) {

            // Tell the framework to start tracking this event.
            //getKeyDispatcherState().startTracking(event, this);
            return true;

        } else if (event.getAction() == KeyEvent.ACTION_UP) {

           // getKeyDispatcherState().handleUpEvent(event);
            if (event.isTracking() && !event.isCanceled()) {

                // DO BACK ACTION HERE
                return true;

            }
        }*/

        // if you don't want use system  listener 
        // return super.dispatchKeyEvent(event);
        return false;

    } else {
        return super.dispatchKeyEvent(event);
    }
}


1 commentaires

Ouais, cela fonctionnera mais il compte comme une "solution de contournement". Comme je l'ai dit dans la réponse de Talklittle ci-dessous, j'ai trouvé de nombreuses solutions de contournement. Mais j'étais curieux pour la solution réelle et / ou la racine du problème. Merci pour votre réponse cependant!