【问题标题】:How can I open a new xamarin.forms from a new activity如何从新活动中打开新的 xamarin.forms
【发布时间】:2018-07-18 18:31:46
【问题描述】:

开始一个新活动后,我试图打开一个新的 xamarin.form,但 SetContentView 方法需要一个 Android.Views.View 输入,我不知道如何从 xamarin.form 恢复视图

有人可以帮助我吗? 谢谢

[Activity(Label = "SecondActivity", Icon = "@drawable/icon", MainLauncher = true, NoHistory = true)]
public class SecondActivity : Activity
{
    public SecondActivity() { }

    protected async override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        UsbSerialPage page = new UsbSerialPage();   // This is a ContentPage

        // Don't work because UsbSerialPage is a ContentPage (xaml) and not an axml page
        SetContentView(Resource.Layout.UsbSerialPage);

        // Don't work because page is not a Android.Views.View
        SetContentView(page);
    }
}

【问题讨论】:

  • 您是使用标准的Xamarin.Form 解决方案/项目还是使用Xamarin.Forms 原生嵌入?
  • Xamarin.Form CrossPlatform 与 Visual Studio 2017
  • 一个基于Xamarin.Forms的应用程序完全存在于一个活动中(通常是MainActivity,当通过模板创建时),您在基于表单的代码中执行所有页面导航,并且不创建额外的原生Android活动: developer.xamarin.com/guides/xamarin-forms/…
  • 我有一个应用程序,它必须通过 USB 连接到其他设备 - 串行、蓝牙或 NFC。我的想法是创建一个辅助活动来管理通过 USB 进行的通信,该活动仅在应用程序的一部分中提供服务,然后我想将它放在 MainActivity 中。我不能使用这个想法,所以我必须在 MainActivity 中实现所有内容?谢谢
  • 您好,您的问题解决了吗?

标签: android xamarin xamarin.android


【解决方案1】:

您可以使用DependencyService 来调用方法,例如GetSystemService

这些方法必须在继承自 Activity 的类中

在Xamarin.Forms中可以使用Xamarin.Forms.Forms.Context来实现,可以参考thisthis

更新:

我的测试代码:

using Android.Content;
using Xamarin.Forms;
using App2.Droid;
using Android.Hardware.Usb;

[assembly:Dependency(typeof(SendImpl))]
namespace App2.Droid
{
    class SendImpl : ISend
    {
        public void Send()
        {
            //Intent intent = new Intent("com.worldgn.connector.HR_MEASUREMENT");
            //intent.PutExtra("HR_MEASUREMENT","value");
            //Forms.Context.SendBroadcast(intent);
            UsbManager usbManager= Forms.Context.GetSystemService(Context.UsbService) as UsbManager;
        }
    }
}

【讨论】:

  • 您好,我已经更新了我的答案,您可以参考一下。关于obsolete,能不能说明一下你的最低版本是多少,你的目标版本是多少?
  • 对不起,我不明白这个问题。 Android 或 Xamarin 或 Visual Studio 的版本?
  • Xamarin.Forms.Forms.Context.GetSystemService(Context.UsbService) 已过时... :-( 我想我解决了我之前写的问题,你觉得可以吗?谢谢
【解决方案2】:

因为您正在使用 Xamarin.Forms 项目,所以您必须使用可移植项目才能在页面之间导航。您正在尝试从 Android 项目导航到 A ContentPage(这是一个可移植的 xaml 页面)。取而代之的是,您必须转到您的第一个 XAML 页面 (MainPage.xaml) 及其背后的代码 (MainPage.xaml.cs),然后您可以使用 PushAsync(new UsbSerailPage()); 从那里导航到您的 UsbSerialPage。

【讨论】:

  • 感谢您的回复。 “问题”是 UsbSerailPage 使用方法来检索 USB 端口上的信息,这些方法必须在从 Activity 继承的类中,所以我想创建另一个 Activity,而不是使用 MainActivity 例如:Android.Hardware.Usb.UsbManager usbManager = GetSystemService(Context.UsbService) as UsbManager; var permissionGranted = await usbManager.RequestPermissionAsync(selectedPort.Driver.Device, this);
【解决方案3】:

感谢您的回复。 “问题”是 UsbSerailPage 使用方法来检索 USB 端口上的信息,这些方法必须在从 Activity 继承的类中,所以我想创建另一个 Activity,而不是使用 MainActivity

例如:

Android.Hardware.Usb.UsbManager usbManager = GetSystemService(Context.UsbService) as UsbManager;
var permissionGranted = await usbManager.RequestPermissionAsync(selectedPort.Driver.Device, this);

【讨论】:

  • 为什么不使用DependencyService 来设计您的项目?
  • DependencyService 允许你使用继承自Activity 的方法例如GetSystemService (Context.UsbService) 作为UsbManager 方法吗?谢谢
  • 是的,你可以使用Xamarin.Forms.Forms.Context.GetSystemService()
  • GetSystemService方法属于Context,Activity只是一种Context,Service和Application也属于Context。
  • 这是不可能的,你能用你的代码编辑你的第一个问题吗?
【解决方案4】:

我使用 MainViewModel 创建了各种作为 MainActivity 参数传递的类,以便始终在任何子类中使用 Activity 方法:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    /// <summary>
    /// Restituisce la MainActivity.
    /// </summary>
    public static MainActivity Instance { get; private set; }

    /// <summary>
    /// Classe per la gestione del device.
    /// </summary>
    public DeviceBase deviceScelto = null;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        Instance = this;
        // other...
    }
}

public class DeviceService : IDeviceService
{
    /// <summary>
    /// Restituisce il device istanziato.
    /// </summary>
    /// <returns>Device.</returns>
    public IDeviceApp GetDeviceApp()
    {
        switch (App.DeviceScelto)
        {
            case App.EnumDeviceType.UsbSerial:
                MainActivity.Instance.deviceScelto = new UsbSerialDevice(MainActivity.Instance);
                break;

            case App.EnumDeviceType.Bluetooth:
                MainActivity.Instance.deviceScelto = new BluetoothDevice(MainActivity.Instance);
                break;

            default:
            case App.EnumDeviceType.NFC:
                MainActivity.Instance.deviceScelto = new NfcDevice(MainActivity.Instance);
                break;
        }

        return MainActivity.Instance.deviceScelto;
    }
}

public class UsbSerialDevice : DeviceBase, IDeviceApp
{
    public Activity mainActivity;

    /// <summary>
    /// Classe per la gestione del device USB-Seriale ereditata da <see cref="DeviceBase"/> e <see cref="IDeviceApp"/>.
    /// </summary>
    /// <param name="mainActivity">MainActivity.</param>
    public UsbSerialDevice(Activity mainActivity)
    {
        this.mainActivity = mainActivity;
        this.usbManager = this.mainActivity.GetSystemService(Context.UsbService) as UsbManager;
    }
}

谢谢大家,如果您有任何其他建议,请告诉我! ;-)

斯特凡诺

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多