【问题标题】:android.view.InflateException, Android application crash when I try to open menu!android.view.InflateException,当我尝试打开菜单时,Android 应用程序崩溃!
【发布时间】:2011-08-08 16:57:43
【问题描述】:

我为 Android 2.2 编写了一个游戏(使用 GLSurfaceView)应用程序。当我尝试打开菜单时出现以下错误:

android.view.InflateException: Binary XML file line #17: Error inflating class 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) && (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(Native Method) java.lang.reflect.Constructor.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.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(本机方法) -------------------------------------------

【问题讨论】:

  • 是的,您做错了:您没有提供菜单 xml 文件 :) 请编辑您的问题并附加 xml 文件。
  • @Heiko Rupp 是对的,错误在你的 game_menu.xml#17 中,所以请在你的问题中分享。
  • 谢谢。注意:您可以使用 Ctrl+K 来格式化您的代码(甚至是 xml),无需更改 字符!另外:这个 xml 似乎不包含 17 行,创建 IconMenuView 有问题,但也没有指定图标属性。你确定你要膨胀这个 xml 吗???
  • 错误是指二进制 XML。我在哪里可以找到它?但是在我的手机(三星 GalaxyS GT-i9000)上它可以工作。在另一个方面,(一个理念)它总是失败。两者都有 Android 2.2。
  • 该错误是指您尝试膨胀的 xml。如果是game_menu.xml,则错误在第17行。

标签: android


【解决方案1】:

对于像他这样有问题的其他人。发生这种情况的最大原因是因为他没有将android.R.drawable.ic_dialog_alert保存在手机中。他刚打电话。如果这个drawable不存在,inflater会给出一个调用目标异常。

【讨论】:

  • 也许这是真的。我会试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多