Xamarin表单输入键盘停止失去焦点

时间:2016-12-08 14:43:47

标签: android xamarin xamarin.android xamarin.forms

我有一个条目和一个按钮:

<StackLayout>
    <CustomViews:ChatEntryView x:Name="ChatEntry" />
    <Button Text="Send" Command="SendCommand"/>
</StackLayout>

我想在这里实现的是当用户在Entry控件上开始输入类型然后按下按钮时,它不应该隐藏键盘(或丢失Entry Focus)。

这里的ChatEntryView实际上是一个自定义视图,它继承自Entry控件以及我在里面所做的事情:

1。)添加了一个未聚焦的处理程序

Unfocused += ChatEntryView_Unfocused;

void ChatEntryView_Unfocused(object sender, FocusEventArgs e)
{
    this.Focus();
}

2.)在PropertyChanged上尝试处理

protected override void OnPropertyChanged(string propertyName = null)
{
    this.Focus();
    base.OnPropertyChanged(propertyName);
}

3.)尝试处理PropertyChanging

protected override void OnPropertyChanging(string propertyName = null)
{
    this.Focus();
    base.OnPropertyChanging(propertyName);
}

但这三种方法似乎都不起作用。我能够通过制作自定义渲染器来解决IOS问题,而且它不是很整洁(通过实际连接到IOS上的Control.ShouldEndEditing)。

但我现在的问题是在Android上,因为我不知道如何在Android上执行此操作,并且我无法使用Control.ShouldEndEditing(Android上的界面)。

使用上面的处理程序会发生的情况是,输入视图的键盘仍然失去焦点,然后立即再次聚焦,这是非常奇怪的。

键盘向下按(失去焦点),然后向上推(强制对焦)。

1 个答案:

答案 0 :(得分:0)

我知道回答这个问题为时已晚,但它可能对其他人有帮助,我将此代码添加到MainActivity,它可能不是一个简洁的解决方案,但对我有用:

        private bool _lieAboutCurrentFocus;
    public override bool DispatchTouchEvent(MotionEvent ev)
    {
        var focused = CurrentFocus;
        bool customEntryRendererFocused = focused != null && focused.Parent is CustomEntryRenderer_Droid;

        _lieAboutCurrentFocus = customEntryRendererFocused;
        var result = base.DispatchTouchEvent(ev);
        _lieAboutCurrentFocus = false;

        return result;
    }

    public override View CurrentFocus
    {
        get
        {
            if (_lieAboutCurrentFocus)
            {
                return null;
            }

            return base.CurrentFocus;
        }
    }