0

我试图使用这个渲染器:

using System;
using Android.Content;
using Android.Views;
using Android.Widget;

using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(AutoComplete), typeof(xmr_cross_test.Custom_controls.AutoCompleteRenderer))]
namespace xmr_cross_test.Custom_controls
{
    public class AutoCompleteRenderer : ViewRenderer<AutoComplete, AutoCompleteTextView>
    {
        public AutoCompleteRenderer()
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<AutoComplete> e)
        {
            base.OnElementChanged(e);
            AutoComplete autocompletview = (AutoComplete)this.Element;

            var inflatorservice = (LayoutInflater)Context.GetSystemService(Context.LayoutInflaterService);
            var containerView = inflatorservice.Inflate(Resource.Layout.autocomplete_entry, null, false);

            var autoCompleteTextView = containerView.FindViewById<AutoCompleteTextView>(Resource.Id.autocomplete_textview);
            var autoCompleteOptions = new String[] { "Hello", "Hey", "Bonjour" };
            var adapter = new ArrayAdapter<String>(Context, Resource.Layout.list_item, autoCompleteOptions);
            autoCompleteTextView.Hint = "e.g. Hey";
            autoCompleteTextView.Adapter = adapter;
            autoCompleteTextView.TextChanged += (sender, args) =>
            {
                autocompletview.AutoCompleteText = autoCompleteTextView.Text;
            };

            if (e.OldElement == null)
            {
                // perform initial setup
                base.SetNativeControl(autoCompleteTextView); //exception here
            }
        }
    }
}

但是在绑定时遇到了异常::

Java.Lang.IllegalStateException:指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。

在这种情况下是什么child以及如何解决它?

PS:AutoComplete如果需要,可以在代码资源和类中添加引用。

4

1 回答 1

1

所指的“孩子”是autoCompleteTextView

您在 XML 中创建自动完成(然后使用 findViewById 找到它)。这意味着自动完成已附加到 XML 树。它的父级是它嵌套的视图组。

当您打电话时,base.SetNativeControl(autoCompleteTextView);您正试图将相同的视图添加到树中的第二个位置,就像自然界中的一棵真正的(木)树一样,同一片叶子不能同时从两个树枝上长出来。

您的选择是使用糟糕的 hacky 例程从其现有父级中删除:

autoCompleteTextView.RemoveFromParent(); //xamarin

这相当于原生 Android 上的以下代码:

autoCompleteTextView.getParent().removeView(base);

或者以编程方式创建自动完成,然后按照您已经尝试的方式附加它

(或者也许您的基础 dom 树允许您以编程方式移动节点。我不熟悉 xamarin)

于 2017-02-24T10:22:32.497 回答