How to Navigate between Android Specific Pages and Shared Pages in Xamarin.Forms?

半城伤御伤魂 提交于 2021-02-17 05:14:46

问题


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?

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();
    }
}
}

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>

回答1:


There is a great example of Forms to Native and Native to Forms navigation on Github.

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;
    }

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);

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

SetPage (App.GetSecondPage ());

Goodluck,

Revert in case of queries



来源:https://stackoverflow.com/questions/54791878/how-to-navigate-between-android-specific-pages-and-shared-pages-in-xamarin-forms

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!