Wie ein Ergebnis (startActivityForResult) von einer TabHost Aktivität zurück?
-
21-09-2019 - |
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.
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);