Можно ли сделать кнопку на AlertDialog, которая не закрывает диалог автоматически? - PullRequest
3 голосов
/ 08 апреля 2010

У меня есть простое представление списка с некоторыми флажками в диалоговом окне предупреждения.Мне нужно добавить опцию выбрать все / ничего, но вы не можете вызвать меню в диалоговом окне с предупреждением, и я хочу сделать эту функцию с помощью кнопки.Из того, что я видел, какие-либо кнопки (положительные, нейтральные и отрицательные) закрывают диалоговое окно независимо от того.

Итак, возможно ли это?Если нет, какие у меня есть альтернативы?Мое последнее смягчение состоит в том, чтобы просто создать новый вид и воссоздать все.Является ли новый взгляд решением best ?

Ответы [ 5 ]

6 голосов
/ 08 апреля 2010

Итак, возможно ли это?

Не из стандартных кнопок в AlertDialog, AFAIK.

Если нет, какие у меня есть альтернативы?

Вот некоторые из них:

  1. Не предлагать выбрать все / ничего
  2. Не используйте AlertDialog, но используйте диалоговое задание
  3. Не используйте AlertDialog, но используйте другой подкласс Dialog
  4. Ваш цитируемый параметр (не используйте setAdapter(), а вместо этого создайте свой собственный View для содержимого диалога)
  5. Не используйте Dialog вообще, но ListActivity запускается через startActivityForResult() (сродни # 2, просто не заботясь о теме)
5 голосов
/ 27 августа 2012

Вы должны переопределить onClickListener кнопки. Например, для нейтральной кнопки у вас будет что-то вроде этого:

AlertDialog dialog = builder.create();
dialog.setButton(AlertDialog.BUTTON_NEUTRAL, "Neutral", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    } 
});
dialog.setButton(AlertDialog.BUTTON_POSITIVE, "Positive", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
    } 
});
dialog.show();

Button neutralButton = dialog.getButton(DialogInterface.BUTTON_NEUTRAL);
neutralButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View onClick) {                 
        /**
        *
        * your code
        * 
        */

    }
});
0 голосов
/ 10 октября 2012

Это возможно.Решение:

  1. Переопределите метод dismiss на ничего не делать .Это предотвратит отклонение диалога при нажатии любой из кнопок.При желании вы также можете сохранить исходное отклонение.

  2. Измените свой OnClickListener так, чтобы он вызывал суперкласс вашего диалога (то есть * 1016Dismiss () * (AlertDialog ) (а именно super.dismiss()), когда нажата нужная кнопка (кнопки).

Обычно я делаю класс Dialog слушателем, поэтому я сделаю что-то вроде этого

public class MyAlertDialog extends AlertDialog implements OnClickListener {

    // other methods
    @Override
    public void dismiss() {

    }

    // superclass's dismiss, might come in handy when the OnClickListener is not this dialog
    public void normalDismiss() {
        super.dismiss();
    }

    public void onClick(DialogInterface dialog, int which) {
        switch (which) {
        case BUTTON_NEGATIVE:
            // handle your event
            super.dismiss();
            break;
        case BUTTON_NEUTRAL:
            // handle your event
            break;
        case BUTTON_POSITIVE:
        default:
            // handle your event
            super.dismiss();
            break;
        }
    }

}

, чтобы он закрывал диалоговое окно только тогда, когда кнопка NEGATIVE илиНажатие ПОЛОЖИТЕЛЬНО, но диалоговое окно остается на дисплее, когда кнопка НЕЙТРАЛЬНА.

0 голосов
/ 17 мая 2011

Вы пытались расширить класс AlertDialog и включить его в OnCLickListener

public class MyDialog extends AlertDialog implements OnClickListener {
    private Button myButton;

    public void onCreate( Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );
        // use LayoutInflater to get at custom button
        LayoutInflater layoutInflater = (LayoutInflater)getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        View contentView = layoutInflater.inflate( R.layout.mydialog_layout, null );

        // pull button from layout, set listener
        myButton = (Button)contentView.findViewById( R.id.myButtonId );
        myButton.setOnClickListener( this );

        setContentView( contentView );
    }

    public void onClick( View v ) {
        if ( v.getId() == R.id.myButtonId ) {
            // DO your button actions.
        }
    }
}

Следуя этому шаблону, вы можете поместить любые нужные вам кнопки и создать собственную функциональность в самом диалоге. Вы также можете создать свою собственную кнопку во время выполнения, но вам придется выполнить дополнительную работу по настройке текста, размера, значка кнопки и т. Д.

Затем вы можете создать диалоговое окно в своей деятельности с помощью вызова onCreateDialog ().

protected Dialog onCreateDialog( int id ) {
    MyDialog dialog = new MyDialog( this, 0 );
    dialog.setOnCancelListener( this );
    dialog.setOnDismissListener( this );
    return dialog;
}

Надеюсь, это поможет.

0 голосов
/ 08 апреля 2010

Итак, возможно ли это?

Вы можете попробовать использовать следующий метод для размещения своего пользовательского представления в AlertDialog:

android.app.AlertDialog.Builder.setView(View view)

Это представление может содержать вашу кнопку. Просто прикрепите onClickListener к кнопке, которая будет работать с вашим списком.

...