2010-04-08 1 views
3

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

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

ответ

6

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

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

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

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

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

Благодарим за ответ и многочисленные альтернативы :) – Parker

+0

Вариант 4. работает хорошо. Вы можете определить «ListView» в этом настраиваемом макете и прикрепить к нему свой собственный адаптер. Бонусные баллы за использование [CWAC 'MergeAdapater'] (https://github.com/commonsguy/cwac-merge), чтобы иметь названия групп между наборами опций :) – ohhorob

0

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

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

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

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

+0

Знаете ли вы, как создавать красиво выглядящие макеты для кнопок, как в AlertDialog? –

+0

@Vu An Hoa: пожалуйста, задайте отдельный вопрос о своей проблеме, указав подробности о том, что именно вы хотели бы достичь. –

0

Вы пытались расширить класс AlertDialog и он implment 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; 
} 

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

5

Вам нужно переопределить 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

вы избили 256k – user457015

+0

Хорошее решение, m4n3k4s. Благодарю. :) – BruceHill

0

Возможно. Решение

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

  2. Измените OnClickListener так, что он называет суперкласс из вашего диалога (т.е. AlertDialog) «s увольнять() (а именно super.dismiss()), когда кнопка (ы) вы хотите (есть) щелкнул.

Я обычно делаю диалоговое класс слушателя, так что я буду делать что-то вроде этого

 
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; 
     } 
    } 

} 

так, что он будет только закрыть диалоговое окно, когда либо кнопку отрицательный или положительный щелкают, но сохранить диалог на дисплее, когда кнопка НЕЙТРАЛЬНАЯ.

+0

вам также нужна часть, где ваше диалоговое окно становится слушателем кликов – njzk2