Frage

Ich habe 3 Klassen in meinem Beispiel: Klasse A, die Haupttätigkeit. Klasse A ruft eine startActivityForResult:

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

Klasse B, diese Klasse ist ein TabActivity:

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

Klasse C, der diese Klasse ist eine regelmäßige Aktivität:

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

onActivityResult wird in der Klasse A genannt, aber die Result ist RESULT_CANCELED statt RESULT_OK und die Absicht, wird NULL zurückgegeben. Wie kann ich etwas von der Aktivität in einem TabHost zurückkehren?

Ich stelle fest, dass das Problem ist, dass meine Klasse C tatsächlich innerhalb der Klasse B ausgeführt wird, und der Klasse B ist, was die RESULT_CANCELED zurück in die Klasse A I zurückkehrt wissen einfach nicht, eine Arbeit um noch.

War es hilfreich?

Lösung

Oh, Gott! mehr Stunden, nachdem er und die Android-Quellen herunterzuladen, ich bin gekommen, endlich zu einer Lösung.

Wenn Sie sich die Aktivitätsklasse betrachten, sehen Sie, dass finish() Methode sendet nur das Ergebnis zurück, wenn es eine mParent Eigenschaft auf null. Ansonsten ist das Ergebnis verloren.

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

Also meine Lösung ist es, Satz Ergebnis an die übergeordnete Aktivität falls vorhanden, wie folgt aus:

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

Ich hoffe, dass hilfreich sein, wenn jemand sieht für dieses Problem wieder zu umgehen.

Andere Tipps

http: //tylenoly.wordpress .com / 2010/10/27 / how-to-Finish-Aktivität-with-Ergebnisse /

Mit einer leichten Modifikation für "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?

  

Wenn gesetzt und diese Absicht verwendet werden, um eine neue Aktivität von einem zu starten   eine bestehende, dann wird die Antwort Ziel der bestehenden Tätigkeit sein   übertragen auf die neue Aktivität.

Sie könnten eine onActivityResult in der Klasse B sowie und Einführung der Klasse C mit startActivityForResult implementieren. Sobald Sie das Ergebnis in der Klasse B erhalten dann das Ergebnis dort eingestellt (Klasse A), basierend auf dem Ergebnis aus der Klasse C. Ich habe diese aus nicht versucht, aber ich denke, das sollte funktionieren.

Eine andere Sache zu achten ist, dass Aktivität A kein SingleInstance Aktivität sein sollte. Für startActivityForResult Ihre Arbeit der Klasse B eine Unteraktivität Aktivität A sein muss, und das ist in einer einzigen Instanz Tätigkeit nicht möglich ist, beginnt die neue Aktivität (Klasse B) in einer neuen Aufgabe.

Für den Start Activity 2 von Aktivität 1 und bekommen Ergebnis, könnten Sie startActivityForResult verwenden und implementieren onActivityResult in Aktivität 1 und Verwendung 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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top