[英]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.