Pergunta

Eu quero mostrar um AlertDialog com uma opção que pode mudar em cada solicitação. Assim, por exemplo ao mesmo tempo eu quero mostrar a opção "adicionar contatos", enquanto outro momento deve ser "Remover dos contatos".

Meu código funciona no primeiro tempo, no entanto Android parece cache o AlertDialog para que onCreateDialog não é executado na próxima vez. Portanto, a opção não muda mais. Posso impedir que este cache, ou há apenas uma outra maneira de mudar a opção?

Eu estou trabalhando com SDK 1.5, mas utilizando 1.1.

@Override
protected Dialog onCreateDialog(final int id) {
    ...
    String add_remove_contact = res.getString(R.string.profile_add_to_contacts);
    if (user.getContacts().contains(profileID)) {
        add_remove_contact = res.getString(R.string.profile_remove_from_contacts);
        // TODO: this string is not changed when contact status changes 
    }
    final CharSequence[] items = {res.getString(R.string.view_profile),
                                  res.getString(R.string.profile_send_message),
                                  add_remove_contact};
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    ...
    return builder.create();
}
Foi útil?

Solução

Você também pode usar o removeDialog (int) função da atividade. Quando um diálogo é fechada, a atividade basicamente armazena o estado da caixa de diálogo (por motivos de desempenho imagino). Chamando removeDialog (int) sobre as forças de diálogo atividade para descarregar todas as referências para o diálogo e descarta a partir da tela se ele está sendo mostrado.

Criando Diálogos
Atividade # removeDialog (int)

Outras dicas

Dê uma olhada onPrepareDialog método que será chamado antes de diálogo é mostrada. Não É possível alterar os valores necessários com base no tipo do pedido.

Exemplo com data picker

@Override
protected Dialog onCreateDialog(final int id) {
  switch (id) {
  case DIALOG_DATE_ID:
    final Calendar c = Calendar.getInstance();
    return new DatePickerDialog(this, this, c.get(Calendar.YEAR),
                                c.get(Calendar.MONTH), 
                                c.get(Calendar.DAY_OF_MONTH));
  default:
    return super.onCreateDialog(id);
  }
}

@Override
protected void onPrepareDialog(final int id, final Dialog dialog) {
  switch (id) {
  case DIALOG_DATE_ID:
    //update to current time
    final Calendar c = Calendar.getInstance();
    ((DatePickerDialog) dialog).updateDate(c.get(Calendar.YEAR), 
                                           c.get(Calendar.MONTH), 
                                           c.get(Calendar.DAY_OF_MONTH));
    break;
  }
}

Este é um dup desta questão: Android: Não é possível alterar as aparece texto em AlertDialog

Você também pode fazê-lo desta forma: http://andmobidev.blogspot.com/2010/ 03 / modificando-alerta-diálogos-list-items.html

parece abrandar a exibição do menu longpress embora ...

Eu acho que tenho uma correção para o comportamento inconsistente mencionado acima. Quando inicialmente criar o diálogo (quando ainda é uma AlertDialog.Builder), você tem que definir a mensagem para um estado inicial (não nulo) ou onPrepareDialog não irá substituí-lo com o valor pretendido. Então, quando você está criando o diálogo, fazer algo assim para sempre têm um valor não nulo na mensagem. Lutei com isso por dias e encontrei esta solução por acidente:

AlertDialog.Builder resultAlert = new AlertDialog.Builder(context);

if ( message == null ) {
    resultAlert.setMessage("");
} else {
    resultAlert.setMessage(message);
}

Eu entendo os motivos de desempenho para o uso de atividade conseguiu diálogos, mas recomendaria que eles não são usados ??exceto para casos simples. As razões para isso são:

  1. O argumento Bundle só foi adicionado na API nível 8, por isso, não pode ser adotado para compatibilidade com versões anteriores. Isso efetivamente significa que as necessidades onPrepareDialog 'para dependem de variáveis ??não-locais para as diferenças estaduais;

  2. A prática indica mau comportamento e inconsistente em resposta a qualquer diálogo alterações feitas no corpo de 'onPrepareDialog'.

Nenhuma destas dificuldades surgir se diálogos são uma subclasse e criados conforme necessário. 'SetOwnerActivity' pode ser chamado, se necessário.

Quando você tem de diálogo um costume pode alterar itens personalizados usando dialog.getWindow (). FindViewById (...)

Este exemplo salvar o último texto mostrado e exibi-lo novamente na próxima vez que você mostra o diálogo.

// custom dialog
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.customized);

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialogInterface) {
       EditText dialogText = (EditText)dialog.getWindow().findViewById(R.id.customText);
       savedText = dialogText.getText();
    }
});

dialog.show();
EditText dialogText = (EditText)dialog.getWindow().findViewById(R.id.customText);
dialogText.setText(savedText);

xml de diálogo personalizada:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<Button
    android:id="@+id/buttonOK"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="OK"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="16dp" />

<EditText
    android:id="@+id/customText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="19dp"
    android:hint="Message"
    android:ems="10"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

E eu tenho uma idéia, mas não tão bom * Isto é usado quando os usuários não usar o diálogo com bastante freqüência * A solução:.! Primeiro, você deve declarar uma variável (tipo int ) e fazer o valor padrão como 0.such como private int i=0; e antes de usar os métodos showDialog de atividades, aumentar a variável int i e postar o valor i como o parâmetro como método showDialog. o código pode gostar deste

private int i=0;

//before you show the dialog
this.i++;
this.showDialog(this.i);

exatamente. para AlertDialog, que foi criado w / Builder.create(), onPrepareDialog() é inútil. Builder é one-way em que uma vez que o diálogo é criado, você não pode atualizar. eu quero dizer não pode vagamente, eu tenho certeza que você poderia obter um identificador para a vista e fazer tudo manualmente, mas que derrota o ponto de usar o construtor, em primeiro lugar.

A única solução que encontrei foi a de criar manualmente / show / fechar o diálogo em vez de usar onCreateDialog(), showDialog(), etc. Eu tentei ligar removeDialog(), mas que não parecem funcionar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top