Como retornar um resultado (StartActivityForResult) de uma atividade do Tabhost?
-
21-09-2019 - |
Pergunta
Eu tenho 3 classes no meu exemplo: classe A, a atividade principal. Classe A chama um startactivityForresult:
Intent intent = new Intent(this, ClassB.class);
startActivityForResult(intent, "STRING");
Classe B, esta classe é uma tabactividade:
Intent intent = new Intent(this, ClassC.class);
tabHost.addTab...
Classe C, esta classe é uma atividade regular:
Intent intent = this.getIntent();
intent.putExtra("SOMETHING", "EXTRAS");
this.setResult(RESULT_OK, intent);
finish();
OnactivityResult é chamado na classe A, mas o código de resultado é RESULT_CANCELED
ao invés de RESULT_OK
e a intenção retornada é nula. Como retorno algo da atividade dentro de um tabhost?
Percebo que o problema é que minha classe C está realmente funcionando dentro da classe B, e a classe B é o que está retornando o RESULT_CANCELED
De volta à classe A. Eu simplesmente não sei um trabalho ainda.
Solução
Oh Deus! Depois de passar várias horas e baixar as fontes do Android, finalmente cheguei a uma solução.
Se você olhar para a aula de atividade, você verá, que finish()
o método apenas envia de volta o resultado se houver um mParent
propriedade definida como null
. Caso contrário, o resultado será perdido.
public void finish() {
if (mParent == null) {
int resultCode;
Intent resultData;
synchronized (this) {
resultCode = mResultCode;
resultData = mResultData;
}
if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
try {
if (ActivityManagerNative.getDefault()
.finishActivity(mToken, resultCode, resultData)) {
mFinished = true;
}
} catch (RemoteException e) {
// Empty
}
} else {
mParent.finishFromChild(this);
}
}
Portanto, minha solução é definir o resultado da atividade dos pais, se presente, assim:
Intent data = new Intent();
[...]
if (getParent() == null) {
setResult(Activity.RESULT_OK, data);
} else {
getParent().setResult(Activity.RESULT_OK, data);
}
finish();
Espero que isso seja útil se alguém procurar esse problema alternativo novamente.
Outras dicas
http://tylenoly.wordpress.com/2010/10/27/how-to-finish-ativity-with-results/
Com uma ligeira modificação para "param_result"
/* Start Activity */
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setClassName("com.thinoo.ActivityTest", "com.thinoo.ActivityTest.NewActivity");
startActivityForResult(intent,90);
}
/* Called when the second activity's finished */
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode) {
case 90:
if (resultCode == RESULT_OK) {
Bundle res = data.getExtras();
String result = res.getString("param_result");
Log.d("FIRST", "result:"+result);
}
break;
}
}
private void finishWithResult()
{
Bundle conData = new Bundle();
conData.putString("param_result", "Thanks Thanks");
Intent intent = new Intent();
intent.putExtras(conData);
setResult(RESULT_OK, intent);
finish();
}
Intent.Flag_Activity_Forward_Result?
Se definido e essa intenção estiver sendo usada para iniciar uma nova atividade a partir de uma existente, o alvo de resposta da atividade existente será transferido para a nova atividade.
Você também pode implementar um OnactivityResult na classe B e iniciar a Classe C usando o StartActivityForresult. Depois de obter o resultado na classe B, defina o resultado lá (para a classe A) com base no resultado da classe C. Não experimentei isso, mas acho que isso deve funcionar.
Outra coisa a ser observada é que a atividade A não deve ser uma atividade única. Para que o StartActivityForResult trabalhe, sua classe B precisa ser uma sub atividade para a atividade A e isso não é possível em uma única atividade de instância, a nova atividade (classe B) inicia em uma nova tarefa.
Para o início da atividade 2 da Atividade 1 e do resultado, você pode usar o StartActivityForResult e implementar o OnactivityResult na Atividade 1 e usar o SetResult na Atividade2.
Intent intent = new Intent(this, Activity2.class);
intent.putExtra(NUMERO1, numero1);
intent.putExtra(NUMERO2, numero2);
//startActivity(intent);
startActivityForResult(intent, MI_REQUEST_CODE);