繁体   English   中英

如何在Xamarin.Forms中的Android特定页面和共享页面之间导航?

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

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

我的Android活动:

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

    <?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页面的当前状态,如下所示:

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

        return formsPage;
    }

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

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

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

SetPage (App.GetSecondPage ());

祝好运,

查询时还原

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM