【问题标题】:Xamarin fully featured native development?Xamarin 功能齐全的原生开发?
【发布时间】:2014-10-02 08:21:51
【问题描述】:

我有两个关于 Xamarin 的问题:

1) 假设我们已经安装了 Xamarin 并创建了一个包含 3 个项目的示例解决方案:一个跨平台通用项目,例如 Xamarin.Forms 引用(此项目将被另外两个引用);一个参考 Xamarin.Android 的 Android 平台特定项目;以及另外一个针对 iOS 的平台特定项目。

那么,问题来了:这些特定于平台的项目是“原生开发”项目的全功能副本吗?换句话说 - 我是否能够在 Xamarin.Android 项目中做同样的事情,例如在 adt+java 中?

这是否意味着,如果我在我的解决方案中不使用任何跨平台库,那么我最终会使用相同的原生开发工具,就像我在 Android 上使用 Adt+java 一样?

2)第二个问题与Android Xamarin开发有关。我的主要活动类是从Activity 类派生而来的

[Activity(Label = "HelloWorld", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.myLay);
    }
}

在方法OnCreate 中,我正在设置我创建的主视图。一切正常,我的布局显示在模拟器上。这是设置布局的正确方法吗?

如果我将尝试访问属于我的布局一部分的某些元素,如下所示:

var textView = FindViewById(Resource.Id.textView1);

然后我得到空引用,就像没有这样的元素但它存在。

这是我的布局`myLay.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minWidth="25px"
android:minHeight="25px">
<TextView
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/textView1" />
<EditText
    android:inputType="textMultiLine"
    android:layout_width="match_parent"
    android:layout_height="285.1dp"
    android:id="@+id/editText1"
    android:layout_marginBottom="306.8dp"
    android:text="some text" />
</LinearLayout>

那么如何在代码中访问视图呢?

【问题讨论】:

  • 您的代码看起来正确。您在哪里调用 FindViewById?你能展示更多你的代码以及你得到异常的地方吗?

标签: c# android xamarin xamarin.ios xamarin.android


【解决方案1】:

我还没有开发过原生 Android 应用程序,所以我可能无法正确回答您的问题,但我认为您不能将它们视为原生开发项目的完整副本。您基本上是在使用 Xamarin 已经公开的 API 来实现您可以在 Android 中执行的类似任务。您可能仍然可以在原生 Android 开发中实现某些目标,但 Xamarin 无法实现,反之亦然。

要回答第二个问题,正确的代码行是:

var textView = FindViewById<TextView> (Resource.Id.textView1);

另外,您使用了正确的方法来设置活动的布局。

【讨论】:

  • 这并不完全正确。 Xamarin 通过绑定完全支持 Android 和 iOS 上的所有本机 API。 Xamarin 不是模拟器。如果有未公开的 API,您可以创建自己的绑定。这适用于平台 API 以及您想要使用的任何 3rd 方组件。最终,Xamarin 会生成原生 Android/iOS 应用程序。它只是引导 Mono 运行时以支持 .NET。
  • 是的,Xamarin 是独立的 .net 世界,它与 Android 上的 java 世界交互。您甚至可以获得两个垃圾收集器(每个一个)。哈。
  • 我也想说类似的话,绝不是要通过暗示它只是一个模拟器来低估 Xamarin 的力量。但是,你们使用了一些正确的词并澄清了任何歧义。谢谢!
  • 您可能已经注意到,我的 Activity 类是从基类 Activity 派生的。但是还有一个类AndroidActivity,它是创建项目时默认提供的事件。据我了解,我应该在使用 Xamarin.Forms 时使用它,对吧?
  • 由于我还没有使用过 Xamarin.Forms,因此我无法对此进行回复。但是,我的所有活动都是从基类 Activity 派生的
【解决方案2】:
  1. Xamarin.Android 允许您为 Android 编写 C# 代码。它直接映射到您在 Java 中可用的所有 API。 Xamarin.Forms 是一个跨平台的抽象。它的所有组件都映射到每个平台上的本机组件。您可以通过 Xamarin.Forms 实现的任何事情都可以通过使用 Java 的“本机”Android 开发来实现,但反之则不行。为了获得对所有 Android API 的完全访问权限,您需要使用 Xamarin.Android。
  2. 确保仅在调用 SetContentView 之后调用 FindViewById。试试这个:

        base.OnCreate(bundle);  
    
        SetContentView(Resource.Layout.myLay);
        var textView = FindViewById<TextView>(Resource.Id.textView1);   
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多