2011-01-24 3 views
4

Для пользовательского AlertDialog я могу переопределить положительную кнопку, чтобы НЕ закрыть диалог? вместо этого я хочу запустить некоторые проверки прав и оставить диалог открытым, если мои проверки не удались.AlertDialog - как я могу запускать проверки, когда пользователь нажимает «OK»

protected Dialog onCreateDialog(int id) { 
    Dialog alertDialog = null; 
    builder = new AlertDialog.Builder(this); 
    switch(id) { 
    case LOGIN_USERID_BLANK: 
     builder.setMessage((String)getString(R.string.username_not_blank)); 
     builder.setPositiveButton((String)getString(R.string.ok), new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
     // Can I do something here so that the dialog does not close? 
} 
}); 

break;

ответ

1

Хорошо, вот только идея о том, как это можно реализовать.

AlertDialog.Builder имеет setView(View v) способ. Таким образом, можно добавить, скажем, пользовательский LinearLayout (завышенный от ресурсов прямо перед зданием Dialog) с помощью кнопок (ов). Затем просто установите обычный android.view.View.OnClickListener(s) на кнопку (и). В этом случае не используйте эти «встроенные/нативные» для кнопок AlertDialog.Builder.

+0

В то время как это предложение может работать, я не думаю, что это предназначено для AlertDialog. В этот момент я не уверен, что AlertDialog предлагает любую выгоду в универсальном настраиваемом диалоге и, вероятно, путает будущих поддерживающих код. –

+0

@glenviewjeff: Я согласен, что это своего рода хак, и это определенно потребует приятного комментария в коде. Также обратите внимание, что никто не предлагал ничего лучшего, пока мое предложение действительно делает то, что требуется. Еще один момент, который вам, возможно, не хватает, заключается в том, что «встроенные» диалоговые кнопки автоматически закрывают диалоговое окно после запуска их слушателей, поэтому они не будут соответствовать запрошенному поведению. Вы когда-нибудь реализовывали общий пользовательский диалог? Если да - не могли бы вы поделиться этим кодом (я этого никогда не делал, поэтому мне интересно увидеть образец). –

+0

Я отложил проверку данных на данный момент, пока не смогу сделать это правильно с помощью специального диалога. Я надеюсь, что они исправят этот недостаток во встроенных диалогах в будущем Android API. Я постараюсь опубликовать что-то, когда я займусь этим, чтобы это исправить. –

0

Вот как я это сделал. Технически это не позволяет технически держать диалог открытым, он мгновенно закрывает его и снова открывает, но чистый результат тот же.

class MyAlertDialog implements OnDismissListener, OnCancelListener { 
    final private EditText editText; 
    final private AlertDialog alertDialog; 
    final private EventManager eventManager; 
    final private CategorySelector categorySelector; 

    private Boolean canceled; 

    MyAlertDialog(Context context) { 
     editText = new EditText(context); 
     alertDialog = buildAlertDialog(context); 
     alertDialog.setOnDismissListener(this); 
     alertDialog.setOnCancelListener(this); 
     show(); 
    } 

    private AlertDialog buildAlertDialog(Context context) { 
     return new AlertDialog.Builder(context) 
     .setTitle(context.getString(R.string.enter_name)) 
     .setMessage(context.getString(R.string.enter_name)) 
     .setView(editText) 
     .setNeutralButton(context.getString(R.string.save_text), null) 
     .setNegativeButton(context.getString(R.string.cancel_text), null).create(); 
    } 

    public void show() { 
     canceled = false; 
     alertDialog.show(); 
    } 

    @Override 
    public void onDismiss(DialogInterface dialog) { 
     if(!canceled) { 
      final String name = editText.getText().toString(); 
      if(name.equals("")) { 
       editText.setError("Please enter a non-empty name"); 
       show(); 
      } else { 
       doWhateverYouWantHere(name); 
      } 
     } 
    } 

    @Override 
    public void onCancel(DialogInterface dialog) { 
     canceled = true; 
    } 
} 
6

Вот обходной путь, пока Google не изменяет Dialog API:

LayoutInflater factory = LayoutInflater.from(this); 
final View view = factory.inflate(R.layout.yoMamma, null); 
final Dialog dlg = new AlertDialog.Builder(this) 
    .setTitle(R.string.yoTitle) 
    .setView(view) 
    .setPositiveButton(R.string.dlgOK, new DialogInterface.OnClickListener() { 
     @Override public void onClick(DialogInterface dialog, int which) { 
     // This won't be called. 
     }}) 
    .create(); 
dlg.show(); 
View button = ((AlertDialog)dlg).getButton(DialogInterface.BUTTON_POSITIVE); 
button.setOnClickListener(new View.OnClickListener() { 
    @Override public void onClick(View v) { 
    // This WILL be called. 
    // Remove the following if you don't want the dialog to dismiss 
    dlg.dismiss(); 
    }}); 
+0

спасибо, что это сработало. –

+0

Вы можете упростить первый вызов setPositiveButton() следующим образом: ".setPositiveButton (R.string.dlgOk, null)" – Mike

0

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

Там, кажется, не быть чистым способом остановить диалог от получения уволен, если вы используете dialogBuilder'ssetNeutralButton или setPositiveButton или setNegativeButton.