Xamarin充分体现了本土发展
本文关键字:Xamarin | 更新日期: 2023-09-27 18:25:22
我有两个关于Xamarin的问题:
1) 假设我们已经安装了Xamarin,并创建了一个包含3个项目的示例解决方案:一个跨平台通用项目,例如Xamarin.Forms引用(该项目将由另外两个项目引用);一个特定于Android平台的项目,参考Xamarin.Android;以及一个针对iOS的平台特定项目。
所以,问题来了:那些特定于平台的项目是否完全是"原生开发"项目的复制品?换句话说,我能在Xamarin.Android项目中做同样的事情吗?比如,adt+java?
这是否意味着,如果我不在我的解决方案中使用任何跨平台库,那么我最终会使用相同的本地开发工具,就像我在android中使用Adt+java一样?
2) 第二个问题与安卓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>
那么,我如何访问代码中的视图呢?
我还没有开发本机Android应用程序,所以我可能无法正确回答您的问题,但我认为您不能将其视为本机开发项目的完整副本。您基本上是在使用Xamarin已经公开的API来实现您可以在Android中完成的类似任务。在原生Android开发中可能仍然有一些事情可以实现,但Xamarin不能实现,甚至反之亦然。
要回答第二个问题,正确的代码行是:
var textView = FindViewById<TextView> (Resource.Id.textView1);
此外,您已经使用了正确的方式来设置活动的布局。
- 安卓系统允许您为安卓系统编写C#代码。它直接映射到Java中所有可用的API。Forms是一个跨平台的抽象。它的所有组件都映射到每个平台上的本机组件。使用Xamarin可以实现的任何功能。使用Java进行"原生"Android开发可以实现表单,但反之亦然。为了获得所有Android API的完全访问权限,您需要使用Xamarin.Android
-
请确保仅在调用SetContentView之后才调用FindViewById。试试这个:
base.OnCreate(bundle); SetContentView(Resource.Layout.myLay); var textView = FindViewById<TextView>(Resource.Id.textView1);