android.view.Исключение InflateException, сбой приложения Android при попытке открыть меню!

#android

#Android

Вопрос:

Я написал игровое приложение (используя GLSurfaceView) для Android 2.2. При попытке открыть меню у меня возникает следующая ошибка:

android.view.InflateException: строка двоичного XML-файла # 17: ошибка при раздувании класса com.android.internal.view.menu.IconMenuView

——— Трассировка стека ———

 android.view.LayoutInflater.createView(LayoutInflater.java:513)
android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565)
android.view.LayoutInflater.inflate(LayoutInflater.java:385)
android.view.LayoutInflater.inflate(LayoutInflater.java:320)
com.android.internal.view.menu.MenuBuilder$MenuType.getMenuView(MenuBuilder.java:197)
com.android.internal.view.menu.MenuBuilder.getMenuView(MenuBuilder.java:323)
com.android.internal.policy.impl.PhoneWindow.initializePanelContent(PhoneWindow.java:840)
com.android.internal.policy.impl.PhoneWindow.openPanel(PhoneWindow.java:417)
com.android.internal.policy.impl.PhoneWindow.onKeyUpPanel(PhoneWindow.java:603)
com.android.internal.policy.impl.PhoneWindow.onKeyUp(PhoneWindow.java:1319)
com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1648)
android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2471)
android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2441)
android.view.ViewRoot.handleMessage(ViewRoot.java:1735)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:123)
android.app.ActivityThread.main(ActivityThread.java:4627)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:521)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
dalvik.system.NativeStart.main(Native Method)
  

Это происходит на некоторых телефонах (на моем ошибка никогда не возникает):

Мой код:

 public class FinalKarate extends Activity
{
    private KarateGLSurfaceView view = null;
    PowerManager.WakeLock wl = null;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        final PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
        wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");           

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                             WindowManager.LayoutParams.FLAG_FULLSCREEN);
        view = new KarateGLSurfaceView(this);
        setContentView(view);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.game_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        // Handle item selection
        switch (item.getItemId())
        {
            case R.id.item01:
                if ((view != null) amp;amp; (view.isPlayingGame()))
                {
                    final boolean alreadyInPause = view.isInPause();
                    if (!alreadyInPause)
                        view.pauseGame();
                    new AlertDialog.Builder(this)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .setTitle(R.string.abort_game)
                    .setMessage(R.string.abort_request)
                    .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                        //@Override
                        public void onClick(DialogInterface dialog, int which) {
                            view.abortGame();    
                        }
                    })
                    .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
                        //@Override
                        public void onClick(DialogInterface dialog, int which) {
                            if (!alreadyInPause)
                                view.resumeGame();    
                        }
                    })
                    .show();
                }
                return true;

            case R.id.item02:
                if (view != null)
                {
                    if (view.isInPause())
                        view.resumeGame();
                    else
                        view.pauseGame();
                }
                return true;

            case R.id.item03:
                if (view != null)
                    view.toggleSimplifiedMode();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}
  

Я что-то не так делаю? Пожалуйста, помогите!

P.s: XML-файл выглядит следующим образом (примечание: я заменил < > на [ ], чтобы опубликовать здесь, на форуме):

 <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@ id/item01" android:title="@string/abort_game"></item>
    <item android:id="@ id/item02" android:title="@string/pause_game"></item>
    <item android:title="@string/simplyMode" android:id="@ id/item03"></item>
</menu>
  

Другая информация:

--------- Причина ---------

java.lang.reflect.Исключение InvocationTargetException

 com.android.internal.view.menu.IconMenuView.(IconMenuView.java:140)
 java.lang.reflect.Constructor.constructNative (собственный метод)
 java.lang.reflect.Конструктор.newInstance (Constructor.java:446)
 android.view.LayoutInflater.CreateView (LayoutInflater.java: 500)
 android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:565)
 android.view.LayoutInflater.inflate (LayoutInflater.java:385)
 android.view.LayoutInflater.inflate (LayoutInflater.java:320)
 com.android.internal.view.menu.MenuBuilder$MenuType.getMenuView(MenuBuilder.java:197)
 com.android.internal.view.menu.MenuBuilder.getMenuView(MenuBuilder.java:323)
 com.android.internal.policy.impl.PhoneWindow.initializePanelContent (PhoneWindow.java:840)
 com.android.internal.policy.impl.PhoneWindow.openPanel (PhoneWindow.java:417)
 com.android.internal.policy.impl.PhoneWindow.onKeyUpPanel (PhoneWindow.java: 603)
 com.android.internal.policy.impl.PhoneWindow.Запуск (PhoneWindow.java: 1319) 
 com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchKeyEvent (PhoneWindow.java:1648)
 android.view.ViewRoot.deliverKeyEventToViewHierarchy (ViewRoot.java: 2471) 
 android.view.ViewRoot.handleFinishedEvent (ViewRoot.java: 2441)
 android.view.ViewRoot.handleMessage (ViewRoot.java: 1735) 
android.os.Handler.DispatchMessage (Обработчик.java:99) 
 android.os.Looper.loop(Looper.java:123)
 android.app.ActivityThread.main (ActivityThread.java:4627)
 java.lang.reflect.Метод.invokeNative (собственный метод)
 java.lang.reflect.Метод.invoke(Method.java:521)
 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
 dalvik.system.NativeStart.main (собственный метод)
-------------------------------

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

1. Да, вы сделали что-то не так: вы не предоставили XML-файл меню 🙂 Пожалуйста, отредактируйте свой вопрос и добавьте XML-файл, пожалуйста.

2. @Heiko Rupp прав, ошибка в вашем game_menu.xml # 17, поэтому, пожалуйста, поделитесь ею в своем вопросе.

3. спасибо. примечание: вы можете использовать Ctrl K для форматирования вашего кода (даже xml), не нужно менять символы < и>! Также: этот xml, похоже, не содержит 17 строк, и что-то не так при создании IconMenuView, но также не указан атрибут icon. Вы уверены, что пытаетесь раздуть этот xml???

4. Ошибка относится к двоичному XML. Где я могу это найти? Однако на моем телефоне (Samsung GalaxyS GT-i9000) это работает. В другом (ideos) это всегда завершается неудачей. Оба имеют Android 2.2.

5. Ошибка относится к xml, который вы пытаетесь раздуть. Если это game_menu.xml ошибка находится в 17-й строке.

Ответ №1:

Для других людей с такими проблемами, как у него. Основная причина, по которой это произошло, заключается в том, что он не сохранил android.R.drawable.ic_dialog_alert внутри телефона. Он просто назвал это. Надуватель выдаст исключение цели вызова для этого извлекаемого объекта, если оно не существует.

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

1. возможно, это правда. я попробую и посмотрю.