AlertDialog.Builder show(),在单击处理程序中崩溃

时间:2012-11-16 15:06:05

标签: java android

我的应用程序从主视图中打开一个新视图:

Intent ElementsIntent = new Intent(this, ElementList.class);
startActivityForResult(ElementsIntent, 0);

显示了一个元素列表,当推送其中一个元素时,一个视图以与之前相同的方式打开一个新的Activity。在这个视图中我想在按钮单击处理程序中显示AlertDialog,但是当我调用show()时,应用程序崩溃了。

我很确定根据我尝试并打开对话框的地方,它与上下文不正确有关,但我尝试从主视图中创建静态上下文,我尝试过使用element.this,这是连接到活动的类,我尝试过getApplicationContext,所有这些都会导致应用程序崩溃。

我希望有人可以解释我做错了什么。

感谢。

这是崩溃的AlertDialog代码:

public void GoBackClickHandler(View v)
{
    AlertDialog.Builder builder = new AlertDialog.Builder(ElementItem.this);
    builder.setMessage("Skal ændringer i besvarelse gemmes?")
           .setCancelable(false)
           .setPositiveButton("Ja", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   dialog.cancel();
                if(inputIsValue())
                {
                    UpdateELement task = new UpdateELement();
                    task.applicationContext = ElementItem.this;
                    task.execute(1);
                }
               }
           })
           .setNegativeButton("Nej", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                    finish();
               }
           });
    AlertDialog alert = builder.create();
    alert.show();       
}

如果我将此代码移动到OnCreate,则警报显示正常并且没有应用程序崩溃。只有当我将它放在ClickHandler中时它才会崩溃。

2 个答案:

答案 0 :(得分:1)

我终于找到了解决这个问题的方法。

我必须在onCreate方法的变量中保存Activity的上下文,然后在ClickHandler AlertDialog调用中使用它,然后一切正常。

希望这对有这个恼人问题的人有所帮助。

答案 1 :(得分:1)

public class SplashActivity extends AppCompatActivity implements DialogInterface.OnClickListener {

    //Object to hold the listener instance
    DialogInterface.OnClickListener listener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        //Assign this to listener.
        listener = this;

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {

                AlertDialog.Builder builder = new AlertDialog.Builder(SplashActivity.this);
                builder.setTitle("Alert");
                builder.setMessage("Alert Message...!");

                //Here pass the listener object.
                builder.setPositiveButton("OK", SplashActivity.this.listener);
                builder.show();

            }

        });

    }

    @Override
        public void onClick(DialogInterface dialog, int which) {

            SplashActivity.this.finish();
        }

}