Eclipse обнаруживает ошибку при реализации setOnShowListener

Я хочу установить метод 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 (новый DialogInterface.OnShowListener() {}) - undefined для типа AlertDialog.Builder" и другой - на builder.getButton(AlertDialog.BUTTON_NEUTRAL), который говорит: "Метод getButton (int) - undefined для типа 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;

Ответ 1

первый из них находится на setOnShowListener, который говорит: "Метод setOnShowListener (новый DialogInterface.OnShowListener() {}) является undefined для типа AlertDialog.Builder"

Есть две причины, по которым вы получите сообщение об ошибке:

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

builder.setOnShowListener(new DialogInterface.OnShowListener() ...
  • Вы никогда не получите код после вызова return.
  • setOnShowListener() - это метод в AlertDialog, а не AlertDialog.Builder.

которые говорят: "Метод getButton (int) - undefined для типа 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;

Ответ 2

Глядя на Документация AlertDialog.Builder, setOnShowListener не является допустимым методом 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;
            }
        });
    }
});

Ответ 3

Или вместо создания AlertDialog вы можете просто использовать стандартный диалог и затем отпустить его, когда хотите или прослушать, когда пользователь закроет диалог. Это было бы лучшей альтернативой вместо того, чтобы использовать поведение по умолчанию кнопки, закрывающей диалог (AlertDialog).