Tenho alguns fragmentos que precisam mostrar um diálogo regular. Nessas caixas de diálogo, o usuário pode escolher uma resposta sim / não e, em seguida, o fragmento deve se comportar de acordo.
Agora, a Fragment
classe não tem um onCreateDialog()
método para sobrescrever, então acho que tenho que implementar os diálogos fora, no contêiner Activity
. Está tudo bem, mas então a Activity
necessidade de relatar a resposta escolhida de alguma forma para o fragmento. Eu poderia, é claro, usar um padrão de retorno de chamada aqui, de modo que o fragmento se registrasse Activity
com uma classe de ouvinte e a Activity relataria a resposta por meio disso, ou algo parecido.
Mas isso parece ser uma grande bagunça para uma tarefa simples como exibir um diálogo sim-não "simples" em um fragmento. Além disso, dessa forma meu Fragment
seria menos independente.
Existe alguma maneira mais limpa de fazer isso?
Editar:
A resposta a esta pergunta não explica em detalhes como se deve usar DialogFragments para exibir caixas de diálogo de Fragments. Então, AFAIK, o caminho a seguir é:
- Exibir um fragmento.
- Quando necessário, instancie um DialogFragment.
- Defina o Fragment original como o destino deste DialogFragment, com
.setTargetFragment()
. - Mostre o DialogFragment com .show () do Fragment original.
- Quando o usuário escolhe alguma opção neste DialogFragment, notifique o Fragment original sobre esta seleção (por exemplo, o usuário clicou em 'sim'), você pode obter a referência do Fragment original com .getTarget ().
- Dispense o DialogFragment.
fonte
Respostas:
Você deve usar um DialogFragment em vez disso.
fonte
Activity
inteiramente usando os métodosputFragment
egetFragment
deFragmentManager
, permitindo que oDialogFragment
reporte diretamente ao fragmento de chamada (mesmo após mudanças de orientação).Devo duvidar cautelosamente da resposta aceita anteriormente de que usar um DialogFragment é a melhor opção. O propósito (principal) pretendido do DialogFragment parece ser exibir fragmentos que são diálogos em si, não exibir fragmentos que têm diálogos para exibir.
Acredito que usar a atividade do fragmento para mediar entre o diálogo e o fragmento é a opção preferível.
fonte
onCreateDialog
abordagem de dialogs gerenciados ( ) logo será descontinuada, eu discordo e digo que esseDialogFragment
é realmente o caminho a seguir.Aqui está um exemplo completo de um DialogFragment sim / não:
A classe:
Para iniciar o diálogo:
Você também pode permitir que a classe implemente onClickListener e use-o em vez de ouvintes incorporados.
Retorno de chamada para atividade
Se você deseja implementar o retorno de chamada, é assim que é feito em sua atividade:
e
A classe de retorno de chamada:
Então, para realizar um retorno de chamada de um fragmento, você precisa se certificar de que o listener está conectado assim:
E um retorno de chamada é executado assim:
fonte
Para mim, foi o seguinte
MyFragment:
MyDialog:
Atividade:
Layout DialogFragment:
Como o nome
dialogfragment_heightfixhiddenbtn
mostra, eu simplesmente não consegui descobrir uma maneira de consertar que a altura do botão inferior foi cortada pela metade, apesar de dizerwrap_content
, então adicionei um botão oculto para ser "cortado" ao meio. Desculpe pelo hack.fonte
setTargetFragment()
é recriado corretamente pelo sistema quando ele reinicia o conjunto de Atividade / Fragmento após a rotação. Portanto, a referência apontará para o novo alvo automaticamente.public interface ShowDialog { void showDialog(DialogFragment dialogFragment); }
onde .test_dialog é um xml personalizado
fonte
Eu também sou um iniciante e honestamente não consegui encontrar uma resposta satisfatória que pudesse entender ou implementar.
Então aqui está um link externo que realmente me ajudou a conseguir o que queria. É muito simples e fácil de seguir.
http://www.helloandroid.com/tutorials/how-display-custom-dialog-your-android-application
ISSO QUE TENTEI OBTER COM O CÓDIGO:
Eu tenho uma MainActivity que hospeda um Fragment. Eu queria que uma caixa de diálogo aparecesse no topo do layout para solicitar a entrada do usuário e, em seguida, processar a entrada de acordo. Veja uma captura de tela
Aqui está a aparência do onCreateView do meu fragmento
Espero que te ajude
Avise-me se houver alguma confusão. :)
fonte
fonte