276 votes

Comment faire pour retourner un résultat (startActivityForResult) à partir d'un TabHost Activité?

J'ai 3 classes dans mon exemple: La classe A, le principal de l'activité. Catégorie appels à un startActivityForResult:

Intent intent = new Intent(this, ClassB.class);
startActivityForResult(intent, "STRING");

De classe B, ce classe est un TabActivity:

Intent intent = new Intent(this, ClassC.class);
tabHost.addTab...

De classe C, cette classe est une Activité régulière:

Intent intent = this.getIntent();
intent.putExtra("SOMETHING", "EXTRAS");
this.setResult(RESULT_OK, intent);
finish();

onActivityResult est appelée dans la Classe A, mais le resultCode est - RESULT_CANCELED au lieu de RESULT_OK et le retour de l'intention est null. Comment puis-je retourner à quelque chose de l'Activité à l'intérieur d'un TabHost?

Je me rends compte que le problème est que ma Classe C est effectivement en cours d'exécution à l'intérieur de la Classe B et de Classe B est ce qui est le retour de l' RESULT_CANCELED dos à la Classe A. je ne sais pas un travail autour de encore.

367voto

Ilya Taranov Points 2305

Oh, dieu! Après avoir passé plusieurs heures et le téléchargement Android sources, j'ai enfin trouvé une solution.

Si vous regardez la classe d'Activité, vous verrez, c' finish() méthode renvoie le résultat si il y a un mParent propriété a la valeur null. Sinon, le résultat est perdu.

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);
    }
}

Donc ma solution est de mettre le résultat de l'activité parent s'il est présent, comme ça:

Intent data = new Intent();
 [...]
if (getParent() == null) {
    setResult(Activity.RESULT_OK, data);
} else {
    getParent().setResult(Activity.RESULT_OK, data);
}
finish();

J'espère que ce sera utile si quelqu'un regarde solution de contournement pour ce problème à nouveau.

64voto

Dave S Points 181

http://tylenoly.wordpress.com/2010/10/27/how-to-finish-activity-with-results/

Avec une légère modification pour "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();
}

16voto

onlythoughtworks Points 491

L'intention.FLAG_ACTIVITY_FORWARD_RESULT?

Si elle est définie et cette intention est utilisé pour lancer une nouvelle activité à partir d'un existante, puis la réponse de la cible de l'activité existante sera transféré à la nouvelle activité.

1voto

Prashast Points 4064

Vous pourriez mettre en œuvre un onActivityResult dans la Classe B, telles que le bien et le lancement de la Classe C à l'aide de startActivityForResult. Une fois que vous obtenez le résultat de la Classe B définissez ensuite le résultat (pour la Classe A) sur la base du résultat de la Classe C. je n'ai pas essayé mais je pense que cela devrait fonctionner.

Une autre chose à surveiller est que l'Activité ne doit pas être une instance unique de l'activité. Pour startActivityForResult de travail de votre Classe B doit être une sous-activité de l'Activité et qui n'est pas possible dans une seule instance de l'activité, de la nouvelle Activité (Classe B) lance dans une nouvelle tâche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X