2017-01-27 3 views
0

Ich habe eine Xamarin Android-Anwendung und ich habe drei Aktivitäten A, B, C. Aktivität A beginnt B, die C kann oder nicht gestartet werden soll ich Aktivität A von Ergebnisse erhalten entweder Aktivität B oder C.Android Aktivität vorwärts Ergebnis nicht wie erwartet funktioniert

Wenn Aktivität B nie Aktivität CI startet erfolgreich Daten zurück an Aktivität A erhalten können, indem Sie

Intent intent = new Intent(); 
intent.PutExtra("DataId", item.Id); 
SetResult(Result.Ok, intent); 

Wenn der Benutzer Aktivität C dann verwende ich diesen Code starten Weiterleitung des Ergebnisses aus Aktivität C Aktivität

Intent intent = new Intent(this, typeof(ActivityC)); 
intent.PutExtra("DataId", dataId); 
intent.SetFlags(ActivityFlags.ForwardResult); 
StartActivity(intent); 

Wenn Aktivität B beginnt Aktivität C und dann Aktivität C nach A zurück erlauben will Rückgabedaten mache ich das mit diesem Code

Intent result = new Intent(); 
result.PutExtra("DataId", dataId); 
SetResult(Result.Ok, result); 
Finish(); 
Intent intent = new Intent(this, typeof(ActivityA)); 
intent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop); 
StartActivity(intent); 

Das alles funktioniert gut. Das Problem tritt auf, wenn Aktivität C keine Daten zurückgeben möchte. Wenn ich für Aktivität C aufrufen und dann versuchen, SetResult(Result.Ok, intent); für Aktivität B aufzurufen, werden diese Werte von Aktivität B nie an Aktivität A zurückgegeben. Sie verwendet immer noch die leeren Daten von Aktivität C, obwohl ich SetResult() nie aufgerufen habe Aktivität C.

Untere Zeile. Wie kann ich Aktivität B erhalten, um nach dem Starten von Aktivität C und Zurückkehren zu Aktivität B die richtigen Daten zurückzugeben?

+0

Wenn Sie Aktivität B und Aktivität C beginnen , verwenden Sie StartActivityForResult wie hier beschrieben? https://developer.xamarin.com/recipes/android/fundamentals/activity/start_activity_for_result/ Ich würde denken, dass, wenn Sie beginnen B von A mit StartActivityForResult, und starten Sie C von B mit dem gleichen, wenn Sie das Ergebnis zurück erhalten C in B stellt dann das Ergebnis von B ein, damit es wieder auf A geht, ich würde denken, dass das funktionieren sollte. Ich sehe nicht, dass Sie StartActivityForResult überall verwenden. – jgoldberger

+0

Ich habe diesen Code weggelassen. Aktivität A startet Aktivität B für Ergebnis. Deshalb funktioniert 'SetResult()' überhaupt. Das Starten der Aktivität C für das Ergebnis und das Verwenden von 'ActivityFlags.ForwardResult' löst eine Ausnahme aus ... – JacobK

Antwort

1

Das Problem tritt auf, wenn die Aktivität C keine Daten zurückgeben möchte. Wenn ich Finish() berufe; auf Aktivität C und dann versuchen, SetResult aufzurufen (Result.Ok, intent); diese Werte von Aktivität B auf die Aktivität B werden nie wieder in Aktivität A.

Wenn Sie ForwardResult verweisen:

Wenn gesetzt und diese Absicht verwendet wird, um eine neue Tätigkeit aus einem bestehenden zu starten Dann wird das Antwortziel der bestehenden Aktivität auf die neue Aktivität übertragen.

Also, aus Ihrer Beschreibung, haben Sie die „Antwort Ziel“ ActivityB-ActivityC weitergeleitet. Wenn Sie zurück ActivityC-ActivityB springen wollen und lassen Sie ActivityBSetResult anrufen, müssen Sie die Rückkehr "antworten Ziel" back to ActivityB durch Zugabe von ActivityFlags.ForwardResult wieder in ActivityC:

//click the button and go back to ActivityB without result 
private void BtnBackBNoResult_Click(object sender, EventArgs e) 
{ 
    Intent intent = new Intent(this, typeof(ActivityB)); 
    intent.PutExtra("Information", "winffee"); 
    intent.AddFlags(ActivityFlags.ForwardResult); 
    StartActivity(intent); 
} 
+0

Dies erwies sich mit 1 Tweak gut funktionieren. Ich wollte keine neue Instanz von ActivityB, also habe ich gerade 'ActivityFlags.SingleTop' hinzugefügt. Vielen Dank! Scheint so einfach, ich kann nicht glauben, dass ich nicht darüber nachgedacht habe. – JacobK

0

Sie in Xamarin die Anwendungsklasse wie beschrieben verwenden können here:

Die Anwendungsklasse

Wenn Sie Zustand über Ihre Anwendung erhalten müssen, dann werden Sie eine Anwendungsklasse benötigen. Es ist zwar möglich, Informationen an Aktivitäts- und Fragmentklassen zu übergeben, wenn Sie jedoch den globalen Status beibehalten müssen (z. B. den derzeit angemeldeten Benutzernamen). Dies erreichen Sie mit einer Anwendungsklasse.

[Application] 
public class MyApplication : Application 
{ 
    public string CurrentUser = ""; 
} 

Beachten Sie, dass die Klasse mit dem Attribut [Application] versehen ist. Dies ist so, dass das erforderliche Element generiert und zur Datei AndroidManifest.xml hinzugefügt wird. Dies stellt sicher, dass die Klasse instanziiert wird, wenn die Anwendung/das Paket erstellt wird.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
android:installLocation="auto" package="com.mydemo.apk" android:versionCode="1"> 
    <!--This line ensures the application class is instantiated automatically--> 
    <application android:label="MyDemo" android:icon="@drawable/Icon"></application> 
</manifest> 

Um die Application-Klasse in Ihrem eigenen Code zu verwenden, müssen Sie auch den aktuellen Kontext bestimmen. In Android bezieht sich der Kontext auf den aktuellen Status der Anwendung/des Objekts. Die Context-Klasse ist auch die Basisklasse für (aber nicht beschränkt auf)

  • Aktivitätsklasse
  • Service-Klasse

Es gibt mehrere Möglichkeiten, wie Sie den Anwendungskontext bestimmen kann. Eine Möglichkeit ist es, ein Verfahren zu Ihrer Anwendungsklassendefinition hinzufügen, dass der Kontext, wie im folgenden Code gibt:

[Application] 
public class MyApplication : Application 
{ 
    public Context GetContext() 
    { 
     return ((this).ApplicationContext); 
    } 
} 

dann im Anwendungscode, können Sie es wie folgt aufrufen.

MyApplication application = (MyApplication)GetContext(); 
String username = application.GetCurrentUser(); 
String password = application.GetPassword(); 
+0

Ich weiß, dass ich die Informationen an einem anderen Ort speichern und später abrufen kann, aber ich möchte eine Lösung finden, die Informationen zwischen Aktivitäten verschiebt ohne die Verwendung einer Anwendungsklasse. Es scheint mir, als ob ich einen Bug in Android gefunden habe, es sei denn jemand kennt eine Lösung. – JacobK

+0

vielleicht sollten Sie uns mehr Code zeigen – CDrosos

+0

die Flagge clear_top Sie vielleicht verwenden, ist das Problem: https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP "Betrachten Sie zum Beispiel eine Aufgabe bestehend aus die Aktivitäten: A, B, C, D. Wenn D startActivity() mit einer Absicht aufruft, die in die Komponente von Aktivität B aufgelöst wird, dann werden C und D beendet und B erhält den vorgegebenen Intent, was dazu führt, dass der Stapel nun wie folgt ist: A, B. – CDrosos

Verwandte Themen