Jelly Bean DatePickerDialog - existe uma maneira de cancelar?

---Nota para moderadores: Hoje (15 de julho), percebi que alguém já enfrentou esse problemaAqui. Mas não tenho certeza se é apropriado encerrar isso como uma duplicata, já que acho que forneci uma explicação muito melhor do problema. Não tenho certeza se devo editar a outra pergunta e colar esse conteúdo lá, mas não me sinto à vontade para mudar demais a pergunta de outra pessoa. ---

Eu tenho algoesquisito Aqui.

Não acho que o problema dependa de qual SDK você cria. A versão do sistema operacional do dispositivo é o que importa.

Problema # 1: inconsistência por padrão

DatePickerDialog foi alterado (?) em Jelly Bean e agora só fornece umFeito botão. Versões anteriores incluíamCancelar botão, e isso pode afetar a experiência do usuário (inconsistência, memória muscular de versões anteriores do Android).

Replicar: Crie um projeto básico. Coloque isso emonCreate:

DatePickerDialog picker = new DatePickerDialog(
        this,
        new OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker v, int y, int m, int d) {
                Log.d("Picker", "Set!");
            }
        },
        2012, 6, 15);
picker.show();

Esperado: A Cancelar botão para aparecer na caixa de diálogo.

Atual: A Cancelar botão não aparece.

Screenshots: 4.0.3 (OK e4.1.1 (possivelmente errado?)

Problema # 2: comportamento de despedimento errado

Diálogo chama qualquer ouvinte que deve chamar de fato e, em seguida,sempre chamadasOnDateSetListener ouvinte. O cancelamento ainda chama o método set e a configuração chama o método duas vezes.

Replicar: Use o código # 1, mas adicione o código abaixo (você verá que isso resolve # 1, mas apenas visualmente / UI):

picker.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", 
        new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.d("Picker", "Cancel!");
            }
        });

Esperado:

Pressionar a tecla BACK ou clicar fora da caixa de diálogo devefazer nada.Pressionar "Cancelar" deve imprimirSelecionador Cancelar!.Pressionando "Set" deve imprimirPicker Set!.

Atual:

Pressionar a tecla BACK ou clicar fora da caixa de diálogo imprimePicker Set!.Pressionando "Cancelar" imprimeSelecionador Cancelar! e depoisPicker Set!.Pressionando "Set" imprimePicker Set! e depoisPicker Set!.

Linhas de log mostrando o comportamento:

07-15 12:00:13.415: D/Picker(21000): Set!

07-15 12:00:24.860: D/Picker(21000): Cancel!
07-15 12:00:24.876: D/Picker(21000): Set!

07-15 12:00:33.696: D/Picker(21000): Set!
07-15 12:00:33.719: D/Picker(21000): Set!
Outras notas e comentáriosEnvolvendo-o em torno de umDatePickerFragment não importa. Eu simplifiquei o problema para você, mas testei.

questionAnswers(19)

yourAnswerToTheQuestion