Lucas Newcomer Blocked Unblock Seguir Seguindo 9 de janeiro
O sumário
O DatePickerDialog
e o TimePickerDialog
são ótimas ferramentas para obter informações de data / hora de um usuário em um dispositivo Android. É claro que é quando as ferramentas funcionam como você espera. No Android 7.0, os atributos datepickermode=”spinner”
e timepickermode=”spinner”
parecem não funcionar nessas visualizações de diálogo e as implementações de design padrão estão sempre visíveis. Isso é muito problemático porque, no Ibotta, achamos que essas implementações padrão não são intuitivas para o 7.0+. Então decidimos corrigi-los e transformar as soluções em uma biblioteca de código aberto !
O problema
Recentemente, a equipe Android Ibotta atualizou nosso DatePickerDialog
no aplicativo Ibotta para sempre aparecer no modo giratório aplicando datepickermode=”spinner”
ao tema da caixa de diálogo. Nós fizemos a mudança e fomos embora pensando que tudo estava bem e elegante. Alguns meses depois, aprendemos que o DatePickerDialog
ainda está sendo exibido para alguns usuários no design de calendário padrão. "Por que, porém?" É o pensamento que imediatamente veio à nossa cabeça. Infelizmente, entramos em ação e começamos a depurar o problema.
Após uma investigação rápida, descobrimos que o problema estava acontecendo apenas em dispositivos que executavam o Android 7.0 e é um problema conhecido na comunidade. Também descobrimos que o modo giratório não está funcionando para o TimePickerDialog
aparentemente pelo mesmo motivo. Após essa investigação, consultamos o Google para ver se eles tinham soluções alternativas, mas não encontramos nada. Dois exemplos de problemas relatados podem ser encontrados aqui e aqui .
Em seguida, procuramos por possíveis correções de terceiros, mas acabamos encontrando um código bastante complicado que parecia hacky. Além disso, essas correções não foram agrupadas em bibliotecas e, portanto, não são plug-and-play. Por exemplo, uma abordagem tratou do método onCreateView
de uma Activity / Fragment para acessar quando uma view DatePicker
é criada. Em seguida, o processo envolveu a remoção e substituição DatePicker's
XML DatePicker's
da biblioteca da plataforma Android, com um arquivo XML DatePicker
criado por você. Por fim, a implementação faria algumas lógicas complicadas para atualizar o tema desta exibição DatePicker recém-substituída para exibir no modo giratório. Esta foi apenas uma abordagem, mas outras abordagens foram igualmente desagradáveis. Devido a essa busca malsucedida por uma solução rápida e limpa para o problema, nós da Ibotta decidimos enfrentar o desafio de frente!
A solução
A principal questão que me levou à minha solução foi: Por que o datepickermode=”spinner”
funciona para um DatePicker
que eu crio em XML e não para o DatePicker
da biblioteca da plataforma Android? ?. Depois de refletir sobre esse pensamento, decidi criar uma classe DatePickerDialog
personalizada e um arquivo XML DatePicker
que imita a classe e o arquivo XML da biblioteca da plataforma. Implementei então este DatePickerDialog
personalizado e apliquei um tema de diálogo à classe com datepickermode=”spinner”
e tudo funcionou como esperado! Depois de corrigir com sucesso o problema do DatePickerDialog
, tentei a mesma solução para o mesmo problema que o TimePickerDialog
tem no Android 7.0 e no huzzah! Corrigido esse problema também.
A única diferença das minhas classes para as classes de diálogo do selecionador da biblioteca da plataforma Android é que a biblioteca tem alguma lógica específica nas classes, como definir o modo de diálogo como true na exibição do selecionador e incluir um retorno de chamada de validação na visualização do selecionador. Essas diferenças não parecem ser o culpado pelo problema. Gostaria de ter uma resposta mais concreta do motivo pelo qual o Custom DatePickerDialog
e o TimePickerDialog
criados corretamente aplicam os atributos do tema ao DatePicker
e as classes da biblioteca da plataforma não. Eu suponho que a biblioteca de plataformas está fazendo algo especial com os atributos do tema que causam um bug para dispositivos 7.0, mas isso ainda é um mistério.
Android 7.0 antes da solução (LEFT) e depois da solução (RIGHT)
Levando-o um passo adiante
Depois de consertar com sucesso o problema do spinner para as caixas de diálogo do selecionador no Android 7.0, decidi levar essa correção um pouco mais longe. Eu fui em frente e fiz a correção em uma biblioteca de código aberto, para que outros possam usá-lo em seus aplicativos. Eu sou um desenvolvedor que acredita em trabalhar de maneira mais inteligente, não mais difícil. Eu uso boas bibliotecas de terceiros o tempo todo para tornar o desenvolvimento mais rápido e fácil, e estou feliz em poder pagá-lo!
A conclusão
Usar o DatePickerDialog
e o TimePickerDialog
maneira giratória pode ser uma ótima maneira de os usuários inserirem dados no seu aplicativo. Se você ainda suporta dispositivos Android 7.0 e quiser ter diálogos de seletores giratórios em seu aplicativo, confira a biblioteca de código aberto do Ibotta, que fornece uma solução simples para esse problema.