Xamarin.Android 中的 OnActivityResult 方法未在 Fragment 中被调用

3

似乎在从相机拍摄照片后,OnActivityResult方法没有被调用。

我是不是调用StartActivityForResult()方法时出了问题?或者有什么我遗漏的地方吗?

 public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Android.OS.Bundle savedInstanceState)
        {
            var m_View = inflater.Inflate (Resource.Layout.Feed, null);

            btnCamera = m_View.FindViewById<Button> (Resource.Id.btnCamera);
            btnGallery = m_View.FindViewById<Button> (Resource.Id.btnGallery);

            ivPicture = m_View.FindViewById<ImageView> (Resource.Id.imageView1);

            btnCamera.Click += (sender, e) => {
                //launch gallery
                //allow photo editing/saving

                var mediaPicker = new MediaPicker (Activity);
                if (!mediaPicker.IsCameraAvailable){
//                      Console.WriteLine ("No Camera!");
                }else {
                    Intent intent = new Intent(MediaStore.ActionImageCapture);
                    StartActivityForResult(intent, 0);
                }
            };

            btnGallery.Click += (sender, e) => {
                //launch gallery
                //allow photo editing/saving
                var imageIntent = new Intent ();
                imageIntent.SetType ("image/*");
                imageIntent.SetAction (Intent.ActionGetContent);
                StartActivityForResult (
                    Intent.CreateChooser (imageIntent, "Select photo"), 0);

            };

            return m_View;
        }

        protected virtual void OnActivityResult (int requestCode, Result resultCode, Intent data)
        {
            System.Console.WriteLine ("WOOOOOOOOOOOOOOOOOOOOOOOOOOOO");
            Uri contentUri = data.Data;
            ivPicture.SetImageURI (data.Data);

        }
4个回答

2

嗯...我创建了一个示例,对我来说运行得很好。我唯一看到的区别是你的重写不正确。它应该是public override void OnActivityResult()

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    var rootView = inflater.Inflate(Resource.Layout.MainFragment, container, false);
    var button = rootView.FindViewById<Button>(Resource.Id.button_camera);
    button.Click += (sender, args) =>
    {
        var intent = new Intent(MediaStore.ActionImageCapture);
        StartActivityForResult(intent, 0);
    };
    return rootView;
}

public override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    Log.Debug("TestFragment", "Got result");

    // do what you want with the result here
}

明天我会试一下。当我编译覆盖void时遇到了问题,但我会再试一次。也许我错过了什么。 - Coova

0
对于使用 Android.Support.V4.App Fragment 的人来说,你可以在你的 Fragment 中重写 OnActivityResult 方法,但是如果你将其与 FragmentActivity 结合使用,它将永远不会被调用! 实际上会调用的是 FragmentActivityOnActivityResult。可以按照以下方式实现:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
}

0
尝试将resultCode数据类型更改为int,而不是Result,并使重写函数public
例如:
public override void OnActivityResult(int requestCode, int resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
}

这对我没有用。仍在寻找解决方案。 - Abhijith C R

-1

检查请求代码是否与提供的 startActivityForResult(intent, 0) 中的 0 是相同的。例如,如果您在此处放置了 999,则在 onActivity result 方法中检查 requestcode == 999。它用于检查 intent 是否与要求的相同,而不是其他任何内容。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 0 && resultCode == RESULT_OK) { // ADD THIS
    // Get Data and do something with it 
    }
}

谢谢尝试,但我不认为问题如此简单。我已经尝试过修改代码,但它从来没有到达OnActivityResult阶段。这与Xamarin有关。 - Coova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接