问题
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