【问题标题】:Xamarin C# cannot convert c# class to Android.content.contextXamarin C# 无法将 c# 类转换为 Android.content.context
【发布时间】:2018-12-06 01:04:09
【问题描述】:

当我按下我在共享代码项目中创建的按钮时,我正在尝试通过显示来自 android 项目的警报对话框来测试我的应用程序的 DependencyService。

当我尝试通过在括号中输入“this”来设置“AlertDialog.Builder”中的 Context 属性时,我收到此错误:“无法从 'CallDiverter2.Droid.CallDiverter_Android' 转换为 'Android.Content.Context' .

命名空间也装饰有:'[assembly: Dependency(typeof(CallDiverter_Android))]'(如果有的话)。

这是我想使用 DependecyService 调用的 android 项目中的函数:

public class CallDiverter_Android : ICallDiverter
{
    public void DivertCall(string callForwardString)
    {
        //Divert call code

        //String callForwardString = "**21*1234567890#";
        //Intent callIntent = new Intent(Intent.ActionDial); // ACTION_CALL
        //Android.Net.Uri uri = Android.Net.Uri.Parse(callForwardString);
        //callIntent.SetData(uri);
        //Android.App.Application.Context.StartActivity(callIntent);


        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        AlertDialog alert = dialog.Create();
        alert.SetTitle("Title");
        alert.SetMessage("Simple Alert");
        alert.SetButton("OK", (s, ev) =>
        {
            alert.SetMessage("This is an alert message");
        });

        alert.Show();
    }

    public void StopCallDiverting()
    {
        //Stop the call diverting action
    }
}

我应该如何解决这个问题才能成功测试dependencyService?

【问题讨论】:

  • new AlertDialog.Builder() 构造函数需要Android.content.context 作为第一个参数,而您传递this,这不是上下文。

标签: c# android xamarin.android


【解决方案1】:

如果你有一个单一的活动应用程序,你可能会侥幸通过传入

Android.App.Application.Context

例如

AlertDialog.Builder dialog = new AlertDialog.Builder(Android.App.Application.Context);

但是要在多活动应用程序中获取当前活动上下文,则需要跟踪它

查看此答案了解如何跟踪当前上下文

https://stackoverflow.com/a/47363378/1612975

【讨论】:

  • 谢谢,您的回答帮助我在按下按钮时显示警报对话框。虽然它现在说“Xamarin.Forms.Forms.Context”已经过时了
  • @MetaDude 对不起Android.App.Application.Context 试试这个
  • @TheGenetral 别太酷了。我试过了,但它抛出了一个未捕获的异常:“无法添加窗口 - 令牌 null 不适用于应用程序”错误消息,并且有点冻结我的视觉工作室。另一方面,您以前的解决方案确实有效。
  • @MetaDude 这是一个单活动应用吗?
  • 在单一活动中,您是指单一窗口应用程序吗?如果是这样,那么是的,目前只有一个窗口
【解决方案2】:

xamarin 中有一个技巧可以做到这一点。 而且大多数人也认为这是非常方便的方法

在其中创建 MainActivity 类的静态属性(单例方法)

internal static MainActivity Instance { get; private set; }

像这样在MainActivity的构造结束时给这个Instance对象赋值

Instance = this;

现在像这样使用它来获取所需的上下文

 AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.Instance);

这很有效,因为大多数 xamarin 表单应用程序只有一个活动,即 MainActivity

【讨论】:

  • 我尝试了您的解决方案,但是当我启动应用程序并单击按钮时,它抛出了一堆错误消息并且没有显示 alertDialog 弹出窗口。
  • 请您分享您遇到的错误。以及如何调用 DivertCall 方法
【解决方案3】:

this 不起作用,因为您的类没有从 Activity/Context 类继承。因此this不能转换为Android.Content.Context

只需使用Android.App.Application.Context 即可获取当前的Android Context。

【讨论】:

  • 嘿,我像 TheGeneral 之前建议的那样尝试过这个,但它冻结了视觉工作室并且无法显示 Aler 窗口。它在 LivePlayer 调试日志中说:“无法添加窗口 - 令牌 null 不适用于应用程序”
  • 尝试像这样从 UI 线程调用它Device.BeginInvokeOnMainThread(() => DependencyService.Get....)
  • 我会试试的。与此同时,我的 ViewModel 出现错误,它在构造函数的命令处输入断点。关于“解析表达式时出错:对象引用未设置为对象的实例”。希望在我知道如何解决这个新问题后它会起作用。谢谢你!
  • 祝你好运,我想你必须自己解决命令问题,否则打开一个新问题。
【解决方案4】:

我刚刚遇到了这个错误并修复了它。 这个问题现在已经很老了,但我将我的见解提供给遇到这个问题的任何人。

事实证明,我不喜欢将与 SQLite 一起使用的类放入 AppName.Android.Persistance 命名空间而不是 AppName.Droid.Persistance

我刚把 Droid 放回去,错误就消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2021-01-16
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多