在onOptionsItemSelected中单击AlertDialog中的按钮会导致模拟器

时间:2016-10-03 23:46:23

标签: java android android-studio

我的主要问题是:无论如何我可以从onOptionsItemSelected()内部触发一个AlertDialog而不会在按下对话框上的按钮时使我的模拟器崩溃吗?

我已经浏览了整个互联网,但我找到的每个人都在说同样的事情,但即使我复制并粘贴他们的代码,我也会得到同样的错误。所以我会尝试解释我的情况。

以下是一个非常简单的AlertDialog示例:

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this)
                    .setTitle("Your Title")
                    .setMessage("Click yes to exit!")
                    .setCancelable(false)
                    .setNeutralButton("Ok",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            dialog.cancel();
                        }
                    });

            // create alert dialog
            AlertDialog alertDialog = alertDialogBuilder.create();
            // show it
            alertDialog.show();

现在这个工作。只要我在onOptionsItemSelected()函数的OUTSIDE上运行它。例如,如果我在onClickListener中为常规Button添加这段代码。然后单击按钮时会出现警告对话框,一切都会正常工作。但是,当我在onOptionsItemSelected()中包含这段代码时。然后会出现警告对话框,但是按下对话框上的按钮会使整个模拟器崩溃。这是我的onOptionsItemSelected():

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()){

        case R.id.action_trash:

            Log.i("trash", "button clicked");


            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this)
                    .setTitle("Your Title")
                    .setMessage("Click yes to exit!")
                    .setCancelable(false)
                    .setNeutralButton("Ok",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            dialog.cancel();
                        }
                    });

            // create alert dialog
            AlertDialog alertDialog = alertDialogBuilder.create();
            // show it
            alertDialog.show();

            return true;
        case R.id.action_help:

            Log.i("help", "button clicked");

            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

现在,当我点击工具栏中与action_trash id关联的项目时。我得到一个警告对话框,但是当我点击OK按钮时,我的整个android模拟器就崩溃了。我仍然可以看到的唯一警告是:

Hax is enabled
Hax ram_size 0x40000000
HAX is working and emulator runs in fast virt mode.
emulator: Listening for console connections on port: 5554
emulator: Serial number of this emulator (for ADB): emulator-5554
EmuGL:WARNING: bad generic pointer 0x7fc16d378600

我非常确定这是一条无关的信息。我有时会看到人们要求LogCats,但是因为整个模拟器崩溃了所以我找不到任何东西。

作为一个附带问题:为什么这甚至根本不起作用?是因为setNeutralButton()内部的onClickListener()以某种方式被破坏了吗?我对android很新,所以如果这是一个很大的错误,将来可以避免任何建议,我们将不胜感激。

P.S。我也试过更换' .Builder(this)'与' .Builder(MainActivity.this)'到目前为止我遇到的所有变化都没有解决问题。

提前致谢:)

1 个答案:

答案 0 :(得分:4)

我遇到了同样的事情。两件不同的事情对我有用。

  1. 将AVD设置更改为"软件 - GLES 2.0"而不是硬件或自动用于"仿真性能"选项。
  2. 启用"显示布局界限"在AVD的开发者选项中。
  3. 其中任何一个都应该解决问题,你不需要同时做这两件事。