A atividade que hospeda esse fragmento é onActivityResult
chamada quando a atividade da câmera retorna.
Meu fragmento inicia uma atividade para um resultado com a intenção enviada para a câmera tirar uma foto. O aplicativo de imagem carrega bem, tira uma foto e retorna. O onActivityResult
porém nunca é atingido. Eu defini pontos de interrupção, mas nada é acionado. Um fragmento pode ter onActivityResult
? Eu acho que sim, já que é uma função fornecida. Por que isso não está sendo acionado?
ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1888);
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if( requestCode == 1888 ) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
}
}
requestCode >= 0
!Respostas:
A atividade de hospedagem substitui
onActivityResult()
, mas nãosuper.onActivityResult()
solicitou códigos de resultado não manipulados. Aparentemente, embora o fragmento seja o responsável pelastartActivityForResult()
chamada, a atividade é a primeira chance de lidar com o resultado. Isso faz sentido quando você considera a modularidade dos fragmentos. Depois que eu implementeisuper.onActivityResult()
para todos os resultados não manipulados, o fragmento conseguiu lidar com o resultado.E também da resposta @siqing:
Para obter o resultado no seu fragmento, ligue em
startActivityForResult(intent,111);
vez degetActivity().startActivityForResult(intent,111);
dentro do fragmento.fonte
getParentFragment().startActivityForResult
para que o fragmento pai tenha seu método onActivityResult chamado.Eu acho que você ligou
getActivity().startActivityForResult(intent,111);
. Você deveria ligarstartActivityForResult(intent,111);
.fonte
RingtonePreference
localizado emPreferenceFragment
. Infelizmente,RingtonePreference
ligaçõesgetActivity().startActivityForResult()
e eu não obtive resultados, mesmo que eu chameisuper.onActivityResult
as atividadesonActivityResult
. Fui obrigado a criar umaRingtonePreference
classe derivada , que se liga àsPreferenceFragment
chamadas efragment.startActivityForResult()
.Opção 1:
Se você estiver chamando
startActivityForResult()
do fragmento, deverá chamarstartActivityForResult()
, nãogetActivity().startActivityForResult()
, pois isso resultará no fragmento onActivityResult ().Se você não tiver certeza de onde está ligando
startActivityForResult()
e como estará ligando para os métodos.Opção 2:
Como Activity obtém o resultado
onActivityResult()
, você precisará substituir as atividadesonActivityResult()
e chamarsuper.onActivityResult()
para propagar para o respectivo fragmento para códigos de resultados não manipulados ou para todos.Se as duas opções acima não funcionarem, consulte a opção 3, pois ela definitivamente funcionará.
Opção 3:
Uma chamada explícita do fragmento para a função onActivityResult é a seguinte.
Na classe Activity pai, substitua o método onActivityResult () e até substitua o mesmo na classe Fragment e chame como o código a seguir.
Na classe pai:
Na classe filho:
fonte
setResult(); finish();
pressionar novamente a segunda atividade e tambémonActivityResult
ser chamado de fornecidoRESULT_CODE
.onActivityResult()
atividade retorna um estranhorequestCode
que é passado para o meu fragmento e depois é ignorado = /Caso você não conheça fragmentos em sua atividade, apenas enumere todos eles e envie argumentos de resultado da atividade:
fonte
Estou tendo o mesmo problema com o
ChildFragmentManager
. O gerente não passará o resultado para o fragmento aninhado, você deve fazer isso manualmente no fragmento base.fonte
Fragment fragment = myChildFragment;
para substituir afindFragmentByTag
linha de código acima . O restante pode ser mantido inalterado.Postagem original.
FragmentActivity
substituirequestCode
por um modificado. Depois disso, quandoonActivityResult()
será chamado,FragmentActivity
analisa os 16 bits mais altos e restaura o índice do fragmento original. Veja este esquema:Se você tiver alguns fragmentos no nível da raiz, não haverá problemas. Mas se você tiver fragmentos aninhados , por exemplo,
Fragment
com algumas guias dentroViewPager
, garantiu que terá um problema (ou já o enfrentou).Porque apenas um índice é armazenado dentro
requestCode
. Esse é o índice deFragment
dentro deleFragmentManager
. Quando estamos usando fragmentos aninhados, existem filhosFragmentManager
, que têm sua própria lista de fragmentos. Portanto, é necessário salvar toda a cadeia de índices, começando da raizFragmentManager
.Como resolvemos esse problema? Há uma solução alternativa comum nesta postagem .
GitHub: https://github.com/shamanland/nested-fragment-issue
fonte
Este é um dos problemas mais populares. Podemos encontrar muitos tópicos sobre esse problema. Mas nenhum deles é útil para mim.
Então, eu resolvi esse problema usando esta solução.
Vamos primeiro entender por que isso está acontecendo.
Podemos ligar
startActivityForResult
diretamente do Fragment, mas, na verdade, o mecânico por trás é tratado pela Activity.Depois de ligar
startActivityForResult
de um Fragment, requestCode será alterado para anexar a identidade do Fragment ao código. Isso permitirá que a Activity possa rastrear quem envia essa solicitação assim que o resultado é recebido.Depois que a Atividade for navegada de volta, o resultado será enviado ao onActivityResult da Atividade com o requestCode modificado, que será decodificado para a identidade original do requestCode + Fragment. Depois disso, a Activity enviará o resultado da atividade para esse fragmento por meio de onActivityResult. E está tudo pronto.
O problema é:
A atividade pode enviar o resultado apenas para o fragmento que foi anexado diretamente à atividade, mas não ao aninhado. Essa é a razão pela qual onActivityResult do fragmento aninhado nunca seria chamado, não importa o quê.
Solução:
1) Inicie o Intent no seu fragmento pelo código abaixo:
2) Agora, em sua substituição da atividade dos pais **
onActivityResult()
: **Você deve chamar isso na atividade dos pais para que funcione.
3) Na sua chamada de fragmento:
É isso aí. Com esta solução, ela poderia ser aplicada a qualquer fragmento único, aninhado ou não. E sim, também cobre todo o caso! Além disso, os códigos também são agradáveis e limpos.
fonte
PARA MUITOS FRAGMENTOS NESTADOS (por exemplo, ao usar um ViewPager em um fragmento)
Na sua atividade principal :
No seu fragmento:
No seu fragmento aninhado
Atividade de chamada
uniqueInstanceInt - substitua-o por um int exclusivo entre os fragmentos aninhados para impedir que outro fragmento trate a resposta.
Receber resposta
Atenção
Um número entre 0 e 65536 precisa ser usado em uniqueInstanceInt para evitar erros "Pode usar apenas 16 bits inferiores para requestCode".
fonte
Posso acrescentar dois conselhos se alguém ainda não conseguir. No arquivo Manifest.xml, verifique se a atividade de hospedagem não terminou quando a chamada de retorno e a atividade a ser iniciada têm o modo de inicialização como padrão. Veja os detalhes abaixo:
Para atividade de hospedagem, configure a propriedade no history como false se houver
Para que a Atividade seja iniciada, defina o modo de inicialização como padrão, se houver
fonte
Eu também estava enfrentando o mesmo problema quando transferi esse bloco de código para fora de um fragmento para uma classe de utilitário , com
parentActivity
passado como argumento ,Então, eu não estava obtendo nenhum valor no
onActivityResult
método desse fragmento . Depois, mudei o argumento para Fragment , então a definição revisada do método parecia:Depois disso, consegui valorizar
onActivityResult
o fragmentofonte
Eu também encontrei esse problema em um fragmento. E eu liguei
startActivityForResult
para aDialogFragment
.Mas agora esse problema foi resolvido:
FragmentClassname.this.startActivityForResult
.fonte
startActivityForResult(...)
de uma classe abstrata dentro do código do fragmento.PARA FRAGMENTOS NESTADOS (por exemplo, ao usar um ViewPager)
Na sua atividade principal:
No seu fragmento principal de nível superior (fragmento ViewPager):
Em YourFragment (fragmento aninhado):
fonte
No meu caso, foi um bug do Android ( http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/ ), se você usar o suporte,
FragmentActivity
precisará usar emgetSupportFragmentManager
vez degetChildFragmentManager
:fonte
Em resumo,
Em fragmento, declare
Fragment fragment = this
;após esse uso
fragment.startActivityForResult
.O resultado retornará em activityResult.
fonte
Solução 1:
Ligue em
startActivityForResult(intent, REQUEST_CODE);
vez degetActivity().startActivityForResult(intent, REQUEST_CODE);
.Solução 2:
Quando
startActivityForResult(intent, REQUEST_CODE);
é chamado, a atividadeonActivityResult(requestCode,resultcode,intent)
é invocada e você pode ligar afragments onActivityResult()
partir daqui, passando orequestCode, resultCode and intent
.fonte
Dentro do seu fragmento, ligue
onde
this
está se referindo ao fragmento. Caso contrário, faça como o @Clevester disse:Eu também tive que ligar
na atividade dos pais
onActivityResult
para fazê-lo funcionar.(Adaptei esta resposta da resposta de @ Clevester.)
fonte
Para aqueles que usam Android componente de navegação deve usar na Actividade
onActivityResult(...)
doprimaryNavigationFragment
conseguir é referência fragmento e chamada fragmento defragment.onActivityResult(...)
.Aqui está a atividade
onActivityResult(...)
fonte
A maioria dessas respostas continua dizendo que você deve ligar
super.onActivityResult(...)
para o seu hostActivity
paraFragment
. Mas isso não parecia estar funcionando para mim.Então, no seu host,
Activity
você deve ligar para o seuFragments
onActivityResult(...)
. Aqui está um exemplo.Em algum momento do seu processo,
HostActivity
você precisará atribuirthis.myFragment
oFragment
que está usando. Ou use oFragmentManager
para obter o emFragment
vez de manter uma referência a ele no seuHostActivity
. Além disso, verifiquenull
antes de tentar ligar parathis.myFragment.onActivityResult(...);
.fonte
fonte
Você pode simplesmente substituir BaseActivity
onActivityResult
no fragmentobaseActivity.startActivityForResult
.Em BaseActivity, adicione interface e substitua onActivityResult.
Em implementos de fragmento
OnBaseActivityResult
Esta solução alternativa fará o truque.
fonte
Se o problema acima for enfrentado no login do Facebook , você poderá usar o código abaixo em uma atividade pai do seu fragmento, como:
Ou:
E adicione a chamada abaixo no seu fragmento ...
fonte
Outro caso de uso ainda não descrito em outras respostas:
onActivityResult()
declarado no fragmento não é chamado ao usarexception.startResolutionForResult()
:Nesse caso, substitua
exception.startResolutionForResult()
pelo fragmentostartIntentSenderForResult()
:fonte
Versão do Kotlin (Em sua atividade noActivityResult ())
fonte
Como o Ollie C mencionou, há um bug ativo para a biblioteca de suporte que usa valores retornados para onActivityResult quando você está usando fragmentos aninhados. Eu acabei de acertar :-(.
Consulte Fragment.onActivityResult não chamado quando requestCode! = 0 .
fonte
Eu tenho uma forte suspeita de que todas as respostas aqui nada mais são do que hacks. Eu tentei todos eles e muitos outros, mas sem nenhuma conclusão confiável, pois sempre há algum tipo de problema estúpido. Eu, pelo menos não posso confiar em resultados inconsistentes. Se você consultar a documentação oficial da API do Android para Fragments, verá que o Google declara claramente o seguinte:
Consulte: API de fragmentos do Android
Portanto, parece que a abordagem mais correta e confiável seria realmente chamar startActivityForResult () da atividade de hospedagem e também manipular o onActivityResult () resultante a partir daí.
fonte
mActivity.startActivityFromFragment(this, intent, requestCode)
- por isso nada mais é que um invólucro de conveniênciaSeu código possui um fragmento aninhado. Chamar super.onActivityForResult não funciona
Você não deseja modificar todas as atividades das quais seu fragmento pode ser chamado e / ou trabalhar para chamar cada fragmento na cadeia de fragmentos.
Aqui está uma das muitas soluções de trabalho. crie um fragmento rapidamente e conecte-o diretamente à atividade com o gerenciador de fragmentos de suporte. Em seguida, chame startActivityForResult a partir do fragmento recém-criado.
fonte
Meu problema foi com a atividade Host que encontrei com um conjunto
android:launchMode="standard"
que o removi temporariamente e funcionou!fonte
onActivityResult não funcionará se o seu modo de inicialização estiver definido como SingleInstance ou SingleTask. ou você chama sua atividade usando esses IntentFilters
standard
ousingleTop
o modo de inicialização funcionará bem.fonte
Se você estiver usando fragmentos aninhados, isso também funcionará:
Além disso, você deve chamar
super.onActivityResult
da atividade dos pais e preencher oonActivityResult
método do fragmento.fonte
Eu lidei com o problema escrevendo uma classe base que se estende
Fragment
e, naonactivityresult
atividade, identifiquei o fragmento em execução no momento usando ofragmenttag
. Então eu chamo um método definido pelo usuário na classe fragmentbase. Isso disparará um evento no fragmento em execução no momento.fonte