0

我想设置我的 setOnShowListener() 方法来防止对话框关闭,所以我写了这样的东西,

public Dialog update_pop_up()
{
    final AlertDialog.Builder builder = new AlertDialog.Builder(UgJadwal.this);
    LayoutInflater inflater = UgJadwal.this.getLayoutInflater();
    View dialogView = inflater.inflate(R.layout.updatepopup, null);
    builder.setView(dialogView);
    builder.setIcon(R.drawable.update);
    builder.setTitle("Update schedule");

    builder.setPositiveButton(R.string.update, new DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int id)
        {

        }
    });

    builder.setNeutralButton(R.string.retrieve, new DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int id)
        {

        }
    });

    builder.setNegativeButton(R.string.cancel, null);
    return builder.create();

    builder.setOnShowListener(new DialogInterface.OnShowListener()
    {
        @Override
        public void onShow(DialogInterface dialog)
        {
            Button retrieve = builder.getButton(AlertDialog.BUTTON_NEUTRAL);
            retrieve.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    //do nothing;
                }
            });
        }
    });
}

至少有两个由 Eclipse 提示的错误,第一个是在上面setOnShowListener说“方法 setOnShowListener(new DialogInterface.OnShowListener(){}) 未定义类型 AlertDialog.Builder”,另一个在上面builder.getButton(AlertDialog.BUTTON_NEUTRAL)说“方法 getButton(int) 未为 AlertDialog.Builder 类型定义”。我只是想知道为什么它会引发错误,因为我认为我做得对。请问大家有什么办法解决吗,谢谢。

[更新!!] 感谢大家的帮助。这是我最后的方法setOnShowListener()

dialog.setOnShowListener(new DialogInterface.OnShowListener()
    {
        @Override
        public void onShow(DialogInterface dialog)
        {
            Button retrieve = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_NEUTRAL);
            retrieve.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    datasource.opentoread();
                    String[] hari = datasource.fetchDaily(ids.getText().toString());
                    datasource.close();
                    day.setText(String.valueOf(hari[0]));
                    subject.setText(String.valueOf(hari[1]));
                    time.setText(String.valueOf(hari[2]));
                    location.setText(String.valueOf(hari[3]));
                    lecture.setText(String.valueOf(hari[4]));
                    Toast.makeText(getApplicationContext(), "Retrieve success", Toast.LENGTH_LONG).show();
                }
            });
        }
    });
    return dialog;
4

3 回答 3

3

第一个是在 setOnShowListener 上,上面写着“方法 setOnShowListener(new DialogInterface.OnShowListener(){}) 对于 AlertDialog.Builder 类型未定义”

出现此错误的原因有两个:

builder.setNegativeButton(R.string.cancel, null);
return builder.create();

builder.setOnShowListener(new DialogInterface.OnShowListener() ...
  1. 调用后您将永远无法访问任何代码return
  2. setOnShowListener()是 AlertDialog 中的方法,而不是 AlertDialog.Builder。

说“AlertDialog.Builder 类型的方法 getButton(int) 未定义”

这是同样的问题,getButton()是AlertDialog中的一个方法,而不是AlertDialog.Builder。


尝试这样的事情:

...
builder.setNegativeButton(R.string.cancel, null);

final AlertDialog dlg = builder.create();
dlg.setOnShowListener(new DialogInterface.OnShowListener()
{
    @Override
    public void onShow(DialogInterface dialog)
    {
        Button retrieve = dlg.getButton(AlertDialog.BUTTON_NEUTRAL);
        // Changed this   ^^^
        retrieve.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //do nothing;
            }
        });
    }
});
return dlg;
于 2013-03-18T23:30:46.370 回答
1

查看AlertDialog.Builder 文档setOnShowListener不是一个有效的方法AlertDialog.Builder。但是,它是 的有效方法AlertDialog,它是 的返回类型builder.create()。同样 for getButtonwhich 实际上是 的一种方法AlertDialog。因此,您的代码应该是:

AlertDialog alertDialog = builder.create();
alertDialog.setOnShowListener(new DialogInterface.OnShowListener()
{
    @Override
    public void onShow(DialogInterface dialog)
    {
        Button retrieve = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL);
        retrieve.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //do nothing;
            }
        });
    }
});
于 2013-03-18T23:30:48.853 回答
0

或者,您可以只使用标准对话框,然后在需要时将其关闭,或者在用户关闭对话框时收听,而不是创建 AlertDialog。这将是一个更好的选择,而不是使用按钮单击关闭对话框 (AlertDialog) 的默认行为。

于 2013-03-18T23:44:04.873 回答