我有一个Xamarin Android应用程序,我有三个活动A,B,C。活动A开始B,可能会也可能不会开始C.我希望活动A从活动B或C获得结果。
如果活动B从未启动活动C,我可以通过
成功地将数据恢复到活动A.Intent intent = new Intent();
intent.PutExtra("DataId", item.Id);
SetResult(Result.Ok, intent);
当用户想要启动活动C时,我使用此代码允许将活动C的结果转发回活动A
Intent intent = new Intent(this, typeof(ActivityC));
intent.PutExtra("DataId", dataId);
intent.SetFlags(ActivityFlags.ForwardResult);
StartActivity(intent);
如果活动B开始活动C,然后活动C想要返回数据,我使用此代码
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);
这一切都运作良好。当活动C不想返回数据时,会发生此问题。如果我在活动C上调用Finish();
然后尝试在活动B上调用SetResult(Result.Ok, intent);
,那么来自活动B的那些值永远不会返回到活动A.它仍在使用来自活动C的空数据,即使我从来没有在活动C上称为'SetResult();`。
底线。在启动活动C并返回活动B后,如何让活动B返回正确的数据?
答案 0 :(得分:1)
当活动C不想返回数据时,会出现问题。如果我调用Finish();在活动C上然后尝试调用SetResult(Result.Ok,intent);在活动B上,来自活动B的那些值永远不会返回到活动A。
如果您参考ForwardResult:
如果设置并且此意图用于从现有活动启动新活动,则现有活动的回复目标将转移到新活动。
因此,根据您的说明,您已转发"回复目标"从ActivityB
到ActivityC
。如果您想从ActivityC
跳回ActivityB
并让ActivityB
拨打SetResult
,则需要返回"回复目标"通过在ActivityB
中再次添加ActivityFlags.ForwardResult
来回到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);
}
答案 1 :(得分:0)
您可以在Xamarin中使用Application here:
所述的Application类应用程序类
如果您需要在整个应用程序中维护状态,那么您将需要一个Application类。虽然可以向Activity / Fragment类传递信息,但如果您需要维护全局状态(例如当前登录的用户名),则可以使用Application类实现此目的。
[Application]
public class MyApplication : Application
{
public string CurrentUser = "";
}
请注意,该类使用[Application]属性进行修饰。这样就生成了必要的元素并将其添加到AndroidManifest.xml文件中。这可确保在创建应用程序/包时实例化类。
<?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>
要在您自己的代码中使用Application类,您还需要确定当前的Context。在Android中,Context指的是应用程序/对象的当前状态。 Context类也是(但不限于)
的基类有几种方法可以确定应用程序上下文。一种方法是向Application类定义添加一个方法,该方法返回Context,如下面的代码所示:
[Application]
public class MyApplication : Application
{
public Context GetContext()
{
return ((this).ApplicationContext);
}
}
然后在您的应用程序代码中,您可以按如下方式调用它。
MyApplication application = (MyApplication)GetContext();
String username = application.GetCurrentUser();
String password = application.GetPassword();