Estou usando DialogFragments para várias coisas: escolhendo itens da lista, inserindo texto.
Qual é a melhor maneira de retornar um valor (ou seja, uma string ou um item de uma lista) de volta à atividade / fragmento de chamada?
Atualmente, estou implementando a atividade de chamada DismissListener
e fornecendo ao DialogFragment uma referência à atividade. O Diálogo chama o OnDimiss
método na atividade e a atividade obtém o resultado do objeto DialogFragment. Muito bagunçado e não funciona na mudança de configuração (mudança de orientação), pois o DialogFragment perde a referência à atividade.
Obrigado por qualquer ajuda.
Activity
eoDialogFragment
pode ser recriado. Usar oActivity
passado paraonAttach(Activity activity)
é a maneira correta e recomendada.Respostas:
Use
myDialogFragment.setTargetFragment(this, MY_REQUEST_CODE)
no local em que você mostra a caixa de diálogo e, quando terminar, poderá chamargetTargetFragment().onActivityResult(getTargetRequestCode(), ...)
e implementaronActivityResult()
no fragmento que a contém.Parece um abuso
onActivityResult()
, especialmente porque não envolve atividades. Mas eu já vi isso recomendado pelo pessoal oficial do google, e talvez até nas demos da API. Eu acho que é o queg/setTargetFragment()
foi adicionado.fonte
Como você pode ver aqui, há uma maneira muito simples de fazer isso.
No seu
DialogFragment
add, adicione um ouvinte de interface como:Em seguida, adicione uma referência a esse ouvinte:
Isso será usado para "ativar" o (s) método (s) do ouvinte e também para verificar se a Atividade / Fragmento pai implementa essa interface (veja abaixo).
No
Activity
/FragmentActivity
/Fragment
que "chamado"DialogFragment
simplesmente implementa esta interface.No seu
DialogFragment
tudo, você precisa adicionar no ponto em que deseja descartarDialogFragment
e retornar o resultado é o seguinte:Onde
mEditText.getText().toString()
é o que será passado de volta para a chamadaActivity
.Observe que, se você quiser retornar outra coisa, basta alterar os argumentos que o ouvinte recebe.
Por fim, você deve verificar se a interface foi realmente implementada pela atividade / fragmento pai:
Essa técnica é muito flexível e permite retornar com o resultado, mesmo que você não queira descartar a caixa de diálogo ainda.
fonte
Activity
'sFragmentActivity
', mas se o chamador é umFragment
?Fragment
.Fragment
, você pode fazer algumas coisas: 1. Passe o fragmento como referência (pode não ser uma boa ideia, pois pode causar vazamento de memória). 2. Use asFragmentManager
teclasfindFragmentById
e, casofindFragmentByTag
contrário, obterá os fragmentos que existem em sua atividade. Espero que tenha ajudado. Tenha um ótimo dia!setTargetFragment()
egetTargetFragment()
são mágicos.Existe uma maneira muito mais simples de receber um resultado de um DialogFragment.
Primeiro, em sua Atividade, Fragmento ou FragmentActivity, você precisa adicionar as seguintes informações:
O
requestCode
basicamente é seu rótulo int para o DialogFragment que você chamou, mostrarei como isso funciona em um segundo. O resultCode é o código que você envia de volta do DialogFragment, informando o que aconteceu com Activity, Fragment ou FragmentActivity em espera no momento.O próximo trecho de código a ser inserido é a chamada para o DialogFragment. Um exemplo está aqui:
Com essas três linhas, você está declarando seu DialogFragment, configurando um requestCode (que chamará o onActivityResult (...) assim que o Diálogo for descartado e você estiver mostrando o diálogo. É simples assim.
Agora, em seu DialogFragment, você precisa apenas adicionar uma linha diretamente antes da,
dismiss()
para enviar um resultadoCode de volta para onActivityResult ().É isso aí. Observe que o resultCode é definido como o
int resultCode
que eu definiresultCode = 1;
neste caso.É isso, agora você pode enviar o resultado do seu DialogFragment de volta para a chamada Activity, Fragment ou FragmentActivity.
Além disso, parece que essas informações foram postadas anteriormente, mas não havia um exemplo suficiente, então pensei em fornecer mais detalhes.
EDIT 24.04.2016 Peço desculpas pelo código enganoso acima. Mas você certamente não pode receber o resultado de volta à atividade, visto como a linha:
define um alvo
Fragment
e nãoActivity
. Portanto, para fazer isso, você precisa usar o implement anInterfaceCommunicator
.No seu
DialogFragment
conjunto, uma variável globalCrie uma função pública para lidar com isso
Então, quando você estiver pronto para enviar a parte de trás do código para o
Activity
quando oDialogFragment
é feito em execução, você simplesmente adicionar a linha antes dedismiss();
o seuDialogFragment
:Na sua atividade, agora você precisa fazer duas coisas, a primeira é remover a linha de código que não é mais aplicável:
Em seguida, implemente a interface e pronto. Você pode fazer isso adicionando a seguinte linha à
implements
cláusula na parte superior da sua classe:E então
@Override
a função na atividade,Você usa esse método de interface como usaria o
onActivityResult()
método. Exceto que o método de interface é paraDialogFragments
e o outro é paraFragments
.fonte
dialogFrag.setTargetFragment(this, 1)
de uma Atividade, mas esse método recebe um Fragmento como primeiro argumento, portanto, não foi possível converter. Estou certo ?@Override public void onAttach(Context context) { super.onAttach(context); yourInterface = (YourInterface) context; }
Bem, é tarde demais para ser a resposta, mas aqui está o que eu fiz para obter resultados do
DialogFragment
. muito semelhante à resposta de @ brandon. Aqui estou chamandoDialogFragment
de um fragmento, basta colocar esse código onde você está chamando sua caixa de diálogo.onde
categoryDialog
é o meuDialogFragment
que eu quero chamar e depois disso na sua implementação dedialogfragment
colocar este código onde você está definindo seus dados na intenção. O valor deresultCode
é 1, você pode configurá-lo ou usar o sistema Definido.agora é hora de voltar ao fragmento de chamada e implementar esse método. verifique a validade dos dados ou o sucesso do resultado, se desejar com
resultCode
erequestCode
na condição if.fonte
Abordagem diferente, para permitir que um fragmento se comunique até sua atividade :
1) Defina uma interface pública no fragmento e crie uma variável para ele
2) Transmitir a atividade para a variável mCallback no fragmento
3) Implemente o ouvinte em sua atividade
4) Substitua o OnFragmentInteraction na atividade
Mais informações: https://developer.android.com/training/basics/fragments/communicating.html
fonte
public void onAttach
do fragmento e fazer o casting atividade láUma maneira fácil que encontrei foi a seguinte: implemente este é o seu dialogFragment,
E então, na atividade que chamou o Fragmento de Diálogo, crie a função apropriada como tal:
O Toast é para mostrar que funciona. Trabalhou para mim.
fonte
Interface
do que acoplamento rígido com classes de concreto.Estou muito surpreso ao ver que ninguém sugeriu usando transmissões locais para
DialogFragment
aActivity
comunicação! Acho que é muito mais simples e limpo do que outras sugestões. Essencialmente, você se registra paraActivity
ouvir as transmissões e envia as transmissões locais de suasDialogFragment
instâncias. Simples. Para um guia passo a passo sobre como configurar tudo, veja aqui .fonte
Ou compartilhe o ViewModel como mostrado aqui:
https://developer.android.com/topic/libraries/architecture/viewmodel#sharing_data_between_fragments
fonte
No meu caso, eu precisava passar argumentos para um targetFragment. Mas recebi a exceção "Fragmento já ativo". Por isso, declarei uma interface no meu DialogFragment que parentFragment implementou. Quando parentFragment iniciou um DialogFragment, ele se definiu como TargetFragment. Então, no DialogFragment, chamei
fonte
Na cidade Kotlin
// Minha atividade
Espero que sirva, se você puder melhorar, edite-o. Meu inglês não é muito bom
fonte
se você quiser enviar argumentos e receber o resultado do segundo fragmento, poderá usar Fragment.setArguments para realizar esta tarefa
fonte
Apenas para tê-lo como uma das opções (já que ninguém o mencionou ainda) - você pode usar um barramento de eventos como o Otto. Então, na caixa de diálogo, você faz:
E faça com que seu chamador (Atividade ou Fragmento) assine:
fonte