Eclipse检测setOnShowListener的实现错误

时间:2013-03-18 23:24:58

标签: android android-alertdialog

我想设置我的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”。我只是想知道为什么它会引起错误,因为我认为我做得对。每个人都有想法来解决它,谢谢。

[UPDATE!] 谢谢大家的帮助。这是我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;

3 个答案:

答案 0 :(得分: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。

  3.   

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

    这是同样的问题,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;
    

答案 1 :(得分:1)

查看AlertDialog.Builder documentationsetOnShowListener不是AlertDialog.Builder的有效方法。但是,它是AlertDialog的有效方法,它是builder.create()的返回类型。同样地,getButton实际上是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;
            }
        });
    }
});

答案 2 :(得分:0)

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