O Google recomenda que usamos DialogFragment
em vez de um simples Dialog
usando Fragments API
, mas é absurdo usar um isolado DialogFragment
por um sim-não caixa de mensagem de confirmação simples. Qual é a melhor prática neste caso?
244
Dialog
ouAlertDialog.Builder::create()::show()
criará uma caixa de diálogo que desaparece quando você gira a tela.Respostas:
Sim, use
DialogFragment
eonCreateDialog
você pode simplesmente usar um construtor AlertDialog de qualquer maneira para criar um simplesAlertDialog
com os botões de confirmação Sim / Não. Não é muito código.Com relação à manipulação de eventos em seu fragmento, haveria várias maneiras de fazê-lo, mas eu simplesmente defino uma mensagem
Handler
na minhaFragment
, transmito-a para oDialogFragment
via construtor e depois repito as mensagens de volta para o manipulador do meu fragmento, conforme apropriado nos vários eventos de clique. Mais uma vez, várias maneiras de fazer isso, mas o seguinte funciona para mim.Na caixa de diálogo, mantenha uma mensagem e instancie-a no construtor:
Implemente o
onClickListener
na sua caixa de diálogo e chame o manipulador conforme apropriado:Editar
E como
Message
é parcelável, você pode salvá-loonSaveInstanceState
e restaurá-loEntão em
onCreate
fonte
target
que será nulo se você o carregar de um Bundle. Se o destino de uma mensagem for nulo e você usarsendToTarget
, você receberá uma NullPointerException - não porque a mensagem seja nula, mas porque seu destino é.Você pode criar subclasses DialogFragment genéricas como YesNoDialog e OkDialog e transmitir título e mensagem se usar muito diálogos em seu aplicativo.
Em seguida, chame-o usando o seguinte:
E lide com o resultado
onActivityResult
.fonte
YES_NO_CALL
,getFragmentManager()
eonActivityResult
?YES_NO_CALL
é um int personalizado que é o código de solicitação.getFragmentManager()
obtém o gerenciador de fragmentos da atividade eonActivityResult()
é um método de retorno de chamada do ciclo de vida do fragmento.Use DialogFragment sobre AlertDialog:
Desde a introdução do nível 13 da API :
o método showDialog de Activity foi descontinuado . Não é aconselhável chamar uma caixa de diálogo em outro lugar no código, pois você deverá gerenciar a caixa de diálogo por conta própria (por exemplo, mudança de orientação).
Diferença DialogFragment - AlertDialog
Eles são muito diferentes? Da referência do Android sobre o DialogFragment :
Outras notas
fonte
Eu recomendaria usar
DialogFragment
.Certamente, a criação de uma caixa de diálogo "Sim / Não" com ela é bastante complexa, considerando que deve ser uma tarefa bastante simples, mas a criação de uma caixa de diálogo semelhante também
Dialog
é surpreendentemente complicada.(O ciclo de vida da atividade torna tudo complicado - você deve
Activity
gerenciar o ciclo de vida da caixa de diálogo - e não há como passar parâmetros personalizados, como a mensagem personalizada, seActivity.showDialog
estiver usando níveis de API abaixo de 8)O bom é que você geralmente pode criar sua própria abstração
DialogFragment
facilmente.fonte
String
parâmetro. Quando o usuário clica em "Sim", por exemplo, a caixa de diálogo chama o método da Atividade com o parâmetro "concordo". Esses parâmetros são especificados ao exibir a caixa de diálogo, por exemplo, AskDialog.ask ("Você concorda com estes termos?", "Concorda", "discorda");FragmentManager
'sfindFragmentByTag
. Mas sim, isso requer um pouco de código.Fragment
this
e ter oActivity
extends
seuInterface
. Cuidado com o encadeamento, porém, você pode ativar as chamadas de interface quando não necessariamente as deseja, se sua simultaneidade não estiver sob controle. Não tenho certeza do que isso faz com a memória e os espaguetes de dependência circular, alguém mais gostaria de conversar? A outra opção éMessage
/Handler
mas você ainda pode ter problemas de simultaneidade.AlertDialogFragment genérico com padrão Builder
No meu projeto, eu já utilizado
AlertDialog.Builder
já muito antes de eu descobri que ele é problemático. No entanto, eu não queria alterar muito código em nenhum lugar do meu aplicativo. Além disso, sou fã de passarOnClickListeners
como classes anônimas onde elas são necessárias (ou seja, ao usarsetPositiveButton()
,setNegativeButton()
etc.) em vez de ter de implementar milhares de métodos de retorno de chamada para a comunicação entre um fragmento de diálogo e o fragmento de suporte, que pode, em na minha opinião, levar a um código muito confuso e complexo. Especialmente, se você tiver várias caixas de diálogo diferentes em um fragmento e precisar distinguir nas implementações de retorno de chamada entre a caixa de diálogo exibida no momento.Portanto, combinei diferentes abordagens para criar uma
AlertDialogFragment
classe auxiliar genérica que pode ser usada exatamente comoAlertDialog
:SOLUÇÃO
( Observe que estou usando expressões lambda do Java 8 no meu código, portanto, talvez você precise alterar partes do código se ainda não estiver usando expressões lambda .)
USO
Estou postando isso aqui não apenas para compartilhar minha solução, mas também porque gostaria de pedir a opinião de vocês: Esta abordagem é legítima ou problemática até certo ponto?
fonte
Posso sugerir uma pequena simplificação da resposta de @ ashishduh:
Isso elimina a necessidade de o usuário (da classe) estar familiarizado com os componentes internos do componente e torna o uso realmente simples:
PS No meu caso, eu precisava de uma caixa de diálogo de alerta simples, e foi isso que criei. Você pode aplicar a abordagem a um Sim / Não ou a qualquer outro tipo necessário.
fonte
Use o Diálogo para diálogos simples de sim ou não.
Quando você precisa de visualizações mais complexas nas quais precisa se apossar do ciclo de vida, como oncreate, solicitar permissões, qualquer substituição do ciclo de vida eu usaria um fragmento de diálogo. Assim, você separa as permissões e qualquer outro código que a caixa de diálogo precise operar sem precisar se comunicar com a atividade de chamada.
fonte