Domanda

Ho 3 classi in mio esempio: Classe A, l'attività principale. Classe A chiama uno startSubActivity:

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

Classe B, questa classe è un TabActivity:

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

Classe C, questa classe è una regolare attività:

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

onActivityResult è chiamato in classe A, ma il resultCode è RESULT_CANCELED invece di RESULT_OK e l'intento restituito è nullo. Come faccio a restituire qualcosa dalla attività all'interno di un TabHost?

Mi rendo conto che il problema è che la mia classe C è effettivamente in esecuzione all'interno di Classe B e Classe B è ciò che viene restituita l'RESULT_CANCELED torna alla Classe A. Io proprio non so un'opera ancora in giro.

È stato utile?

Soluzione

Oh, Dio! Dopo aver trascorso diverse ore e il download dei sorgenti di Android, ho finalmente giungere ad una soluzione.

Se si guarda alla Classe di attività, si vedrà, che il metodo finish() invia solo indietro il risultato se c'è una proprietà mParent impostata null. In caso contrario, il risultato è perduto.

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

Quindi la mia soluzione è quella di impostare risultato all'attività genitore se presente, così:

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

Spero che sarà utile se qualcuno guarda a questo problema soluzione ancora una volta.

Altri suggerimenti

http: //tylenoly.wordpress .com / 2010/10/27 / how-to-finish-attività-con-risultati /

Con una leggera modifica per "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 impostato e questo intento viene utilizzato per lanciare una nuova attività da un   uno esistente, allora l'obiettivo risposta dell'attività esistente sarà   trasferito alla nuova attività.

Si potrebbe implementare un onActivityResult in classe B, come bene e lanciare Classe C utilizzando startSubActivity. Una volta che si ottiene il risultato in classe B quindi impostare il risultato lì (per la Classe A) in base al risultato di Classe C. Non ho provato questo fuori, ma credo che questo dovrebbe funzionare.

Un'altra cosa da guardare fuori per è che l'attività A non dovrebbe essere un'attività SingleInstance. Per startSubActivity per funzionare il vostro classe B deve essere un'attività secondaria per attività A e che non è possibile in una singola attività esempio, la nuova attività (Classe B) inizia in una nuova attività.

Per l'avvio di attività 2 da Activity 1 e ottenere il risultato, è possibile utilizzare startSubActivity e implementare onActivityResult in Attività 1 e l'uso setResult in Activity2.

Intent intent = new Intent(this, Activity2.class);
intent.putExtra(NUMERO1, numero1);
intent.putExtra(NUMERO2, numero2);
//startActivity(intent);
startActivityForResult(intent, MI_REQUEST_CODE);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top