【问题标题】:Android OnActivityResult not being called (C#, Xamarin)未调用 Android OnActivityResult (C#, Xamarin)
【发布时间】:2015-12-02 00:59:54
【问题描述】:

我遇到了一个非常有趣的问题。让我强调一下,我没有为 android 编写太多程序,而且似乎我可能在某个地方偏离了轨道。

我的问题是 onActivityResult() 事件的触发。我已经阅读了 Xamarin 收据,但不知何故它不起作用。该例程不会在 MainActivity 中被调用。

我什至尝试在 java 上做一个类似的例子,它就像一个魅力。

那么,现在说正事。我有一个MainActivity,可以启动Configuration Activity。这个活动应该从服务器收集IP(用户手动放入),并将字符串返回给MainActivity。公平而简单。

MainActivity代码sn-p:

[Activity(Label = "Test", MainLauncher = true, Icon = "@drawable/ax")]
public class MainActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.Main);

        setBindigs();

    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        switch (resultCode)
        {
            case Result.Ok:
                //do something
                break;
        }

    }

    private void setBindigs()
    {
        ImageView ax = FindViewById<ImageView>(Resource.Id.ax);
        ax.Click += HandleImageClick;
    }

    private void HandleImageClick(object sender, EventArgs e)
    {
        var conf = new Intent(this, typeof(Configuration));
        StartActivityForResult(conf, Convert.ToInt32(Result.Ok));

    }

还有配置sn-p:

 [Activity(Label = "Configuration")]
public class Configuration : Activity
{
    private Button[] Connects;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Configuration);
        setBindigs();
    }

    private void setBindigs()
    {
        const int KeyboardLength = 2;

        Connects = new Button[KeyboardLength];

        for (int I = 0; I < KeyboardLength; ++I)
        {
            Connects[I] = FindViewById<Button>(Resource.Id.ConnectButton + I);
            Connects[I].Click += HandleKeyboardClick;
        }
    }

    private void HandleKeyboardClick(object sender, EventArgs e)
    {
        Button Clicked = sender as Button;
        Result ActivityResult = Result.Ok;
        String IpText = String.Empty;

        switch(Clicked.Id)
        {
            case Resource.Id.ConnectButton:
                EditText IP = FindViewById<EditText>(Resource.Id.ServerIP);
                IpText = IP.Text;
                break;

            case Resource.Id.DisconnectButton:
                ActivityResult = Result.Canceled;
                break;
        }
      Intent myIntent = new Intent (this, typeof(MainActivity));
      myIntent.PutExtra ("IP", IpText);
      SetResult (Result.Ok, myIntent);
      Finish();

    }

你有什么想法吗?在 java 中,我使用了选项 getIntent(); 而不是 Intent myIntent = new Intent (this, typeof(MainActivity));

【问题讨论】:

  • 您似乎缺少调用 SetResult(Result.Ok);和完成();在您的配置活动中的某个位置。
  • 不,事实上我是这么叫的。只需滚动到配置文件的末尾,您就会看到它。
  • 啊,你是对的。从 iPad 上看。我的错。
  • 您是否混淆了结果代码和请求代码? RequestCode 应该是一个唯一的 ID,用于识别您触发 OnActivityResult 的意图。而结果代码用于识别从被调用活动传递下来的结果的状态。

标签: c# android xamarin


【解决方案1】:

我刚刚在我的代码中发现了问题。为了将来参考,这似乎是问题所在:

当调用StartActivityForResult() 时,我使用了参数StartActivityForResult(conf, Convert.ToInt32(Result.Ok));。看来预期的结果不应该作为Convert.ToInt32(Result.Ok)传递,而是作为0传递。

这解决了我的问题

【讨论】:

  • 对我来说也一样,我只是将StartActivityForResult(intent, (int)Result.Ok); 更改为StartActivityForResult(intent, 0); 并且它有效!谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2015-01-15
  • 2018-12-10
  • 2013-12-02
相关资源
最近更新 更多