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

时间:2019-02-20 17:11:28

标签: c# xamarin android-activity xamarin.forms custom-renderer

我正在尝试在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>

1 个答案:

答案 0 :(得分:1)

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活动中调用setpage方法,您的Android活动也应继承自Xamarin.Forms.Platform.Android.AndroidActivity

SetPage (App.GetSecondPage ());

祝你好运

在查询的情况下还原