如何在Xamarin.Forms中设置android id属性?

时间:2015-01-16 13:29:34

标签: c# android xamarin xamarin.forms

我需要在共享的Xamarin.Forms代码之外访问由Xamarin.Forms创建的视图。

如何在Xamarin.Forms中设置android id属性?

2 个答案:

答案 0 :(得分:3)

获取Android ID的一种方法是通过自定义渲染器。例如,如果有问题的视图是Xamarin.Forms.Editor,您可以按如下方式向应用添加自定义渲染器:

首先,在您的Xamarin.Forms项目中,添加一个类,该类派生自您希望从中获取ID的视图:

namespace MyApp
{
    public class CustomEditor : Editor
    {
    }
}

请注意,此课程不会添加任何新成员,它只是用于定义我们需要将自定义渲染器与之关联的新类型。

然后,在您的Xamarin Android项目中,添加自定义渲染器并将其与自定义视图类型相关联:

using System;
using MyApp;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;


[assembly: ExportRenderer(typeof(CustomEditor), typeof(CustomEditorRenderer))]

namespace MyApp.Android
{
    class CustomEditorRenderer : EditorRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Editor> e)
        {
            base.OnElementChanged(e);

            int androidId = this.Id; // android widget id
            Guid xamarinId = e.NewElement.Id; // xamarin view id

        }
    }

在该自定义渲染器中,您现在可以访问与Xamarin Forms视图关联的基础Android窗口小部件。这意味着你也可以获得Android .id属性。

请注意:

  • 为此,在您的Xamarin.Forms用户界面中,您需要使用CustomEditor而不是库存编辑器类
  • 并非所有Xamarin Forms视图都具有您可以派生的自定义渲染器。有些像ListViewRenderer是内部类,不支持在代码中继承。在这些情况下,您无法使用此技术。

答案 1 :(得分:-2)

wolenjager的答案基本上是正确的,但为了更容易,我甚至不会创建自定义控件。即时通讯创建基本编辑器的自定义渲染器(Android中的TextEdit)在我的情况下,我在整个应用程序中只有1个编辑器

[assembly: ExportRenderer(typeof(Editor), typeof(EditorRender))]

命名空间YournNameSpace.Droid.PlatformSpecific {

    using Android.Views.InputMethods;
    using Xamarin.Forms.Platform.Android;

        public class EditorRender : EditorRenderer
        {
            protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
            {
                this.Id = 1111111908; //some id i can remember
                base.OnElementChanged(e); // when the control actually gets created



            }
        }

然后当我需要去获取这个TextEdit时,ps“this”是MainActivity

View RootView = this.FindViewById(Android.Resource.Id.Content);
var textEdit = RootView.RootView.FindViewById(1111111908);