Estou iniciando uma nova atividade do meu fragmento com
startActivityForResult(intent, 1);
e deseja manipular o resultado na atividade pai do fragmento:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
if (requestCode == 1) {
// bla bla bla
}
}
O problema é que nunca recebi o requestCode
que acabei de publicar startActivityForResult()
.
Eu tenho algo parecido 0x40001
, 0x20001
etc. com um conjunto de bits mais alto aleatório. Os documentos não dizem nada sobre isso. Alguma ideia?
android
android-fragments
onactivityresult
Dimanóide
fonte
fonte
Respostas:
Você está ligando
startActivityForResult()
do seuFragment
. Quando você faz isso, orequestCode
é alterado peloActivity
que possui oFragment
.Se você deseja obter o correto
resultCode
em sua atividade, tente o seguinte:Mudança:
Para:
fonte
startActivityForResult
em um fragmento e esperar o resultadoonActivityResult
nesse fragmento, certifique-se de chamarsuper.onActivityResult
a atividade do host (caso substitua esse método). Isso ocorre porque a atividadeonActivityResult
parece chamar de fragmentoonActivityResult
. Além disso, observe que o código de solicitação, quando viaja pela atividadeonActivityResult
, é alterado conforme explicado no link que Dimanoid postou em sua resposta abaixo. Você pode não precisar de saber isso, mas nunca se sabe ...O código de solicitação não está errado. Ao usar os fragmentos da biblioteca de suporte v4, o índice do fragmento é codificado nos 16 bits superiores do código de solicitação e o código de solicitação está nos 16 bits inferiores. O índice do fragmento é usado posteriormente para encontrar o fragmento correto para fornecer o resultado.
Portanto, para o Activities iniciado o objeto de fragmento, manipule onActivityResult requestCode como abaixo:
fonte
Mais fácil:
Java :
int unmaskedRequestCode = requestCode & 0x0000ffff
Kotlin :
val unmaskedRequestCode = requestCode and 0x0000ffff
Verifique os 16 bits inferiores, apenas desmascara-o fazendo um AND lógico com os 16 bits superiores zerados
fonte
Se você estiver fornecendo constante, torne-o público e use-o em
startActivityResult
exemplo:
fonte
Você também pode definir
super.onActivityResult(requestCode, resultCode, data)
em
Activity
(se você substituironActivityResult
) nestee chame
startActivityForResult(intent, requestCode)
dentro do seuFragment
fonte
em fragmento
na Atividade Principal:
fonte