如何在Xamarin.Forms中的Android特定页面和共享页面之间导航? [英] How to Navigate between Android Specific Pages and Shared Pages in Xamarin.Forms?

查看:99
本文介绍了如何在Xamarin.Forms中的Android特定页面和共享页面之间导航?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Xamarin Forms中为我的android应用实现相机覆盖.当我将活动MainLauncher设置为True时,我可以使叠加层适用于Android.相反,我该如何从Xamarin.Forms共享代码导航到活动页面,然后再导航回共享页面?

I am trying to implement a camera overlay for my android app in Xamarin Forms. I am able to get my overlay to work for Android when I set my activity MainLauncher to True. How can I instead navigate to the activity page from my Xamarin.Forms shared code, and then later navigate back to the shared pages?

我的Android活动:

My Android Activity:

namespace CustomCamera.Droid
{
[Activity(Label = "CustomCamera", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class CameraOverlayDroid : IAndroidOverlay
{
   public void StartAndroidActivity()
    {
        var intent = new Intent(Android.App.Application.Context, typeof(CameraPreview));
        Android.App.Application.Context.StartActivity(intent);
    }
}
public class CameraPreview : AppCompatActivity
{
    public CameraPreview() { }
    private CustomCameraManager _manager;
    private Bitmap _currentBitmap;
    private CameraResult _currentResult;


    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        //LoadApplication(new App());
        SetContentView(Resource.Layout.Main);
        //Resource.Layout.Main.setTitle("Hello StackOverflow");

        _manager = new CustomCameraManager(this);

        FindViewById<Android.Widget.Button>(Resource.Id.photo_button)
            .Click += async (sender, args) => await Capture(new CameraRequest
            {
                Orientation = SurfaceOrientation.Auto,
                UseFrontCamera = true,
                InitialMessage = "Info message",
                MaxWidthOrHeight = 1080,
                CompressionQuality = 92,
                Overlay = new Overlay(Resource.Drawable.face_silhouette, 15)
            });

    }

    private async Task Capture(CameraRequest request)
    {
        try
        {
            var imageView = FindViewById<ImageView>(Resource.Id.preview_image);

            if (_currentBitmap != null)
            {
                imageView.SetImageDrawable(null);
                _currentBitmap.Recycle();

                File.Delete(_currentResult.FilePath);
            }

            _currentResult = await _manager.GetPhoto(request);
            _currentBitmap = await imageView.LoadFile(_currentResult.FilePath);

            ShowMessage("it works");
        }
        catch (CameraNotAvailableException)
        {
            ShowMessage("Camera is not available");
        }
        catch (PermissionNotGrantedException)
        {
            ShowMessage("Permissions not granted to access camera or storage");
        }
        catch (CameraCancelledException)
        {
            ShowMessage("User has cancelled the operation");
        }
        catch (CameraException cameraException)
        {
            ShowMessage($"{cameraException.ErrorType}: {cameraException.Message}");
        }
        catch (Exception ex)
        {
            ShowMessage($"Something VERY wrong happened: {ex.Message}");
        }
    }

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
    {
        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        _manager?.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }

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

    private void ShowMessage(string message)
    {
        Debug.WriteLine(message);

        Toast
            .MakeText(this, message, ToastLength.Long)
            .Show();
    }
}
}

我的布局:Main.axml

My layout: Main.axml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center">

    <ImageView
        android:id="@+id/preview_image"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:layout_marginTop="15dp"
        android:background="#dddddd" /> 
    <Button
        android:id="@+id/photo_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Take Photo" />
    <Button
        android:id="@+id/continue_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Continue" />
</LinearLayout>

推荐答案

Github.

基本上,您必须在调用本机页面之前,以静态方法维护Xamarin.Forms页面的当前状态,如下所示:

Basically, you have to Maintain the current state of your Xamarin.Forms Page in a Static method before calling the native page something like below:

public static Page GetSecondPage ()
    {
        var formsPage = new NavigationPage (new MyThirdPage ()); 

        return formsPage;
    }

然后从iOS获取您的页面实例,并按如下所示调用以下两行代码(ViewController上下文):

Then from iOS get your page instance and call the below two lines of code as follows(ViewController context):

var secondViewController = App.GetSecondPage().CreateViewController();
NavigationController.PushViewController(secondViewController, true);

然后从您的Android活动中调用setpage方法,您的Android活动也应继承自 Xamarin.Forms.Platform.Android.AndroidActivity

And from your Android Activity call the setpage method, Also you Android activity should inherit from Xamarin.Forms.Platform.Android.AndroidActivity

SetPage (App.GetSecondPage ());

祝你好运

在查询的情况下还原

这篇关于如何在Xamarin.Forms中的Android特定页面和共享页面之间导航?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆