Dialogs Picker Spinner no Android 7.0: Nós os consertamos!

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.