android - 在自定义渲染器中更改键盘的 Xamarin.Forms.Entry 的 ImeOptions 在 Android 上不起作用

标签 android xamarin.forms keyboard renderer xamarin.forms.entry

我有什么:

我有一个派生自 Xamarin.Forms.Entry 的自定义类 MyEntry 和适用于 Android 和 iOS 的自定义渲染器类 MyEntryRenderer

我想要的:

我想通过更改 Android 上的 ImeOptionsReturnKeyType 将键盘的“输入”按钮更改为“搜索”按钮iOS(参见示例代码)。当我按下更改后的“搜索”按钮时,应该调用 MyEntry.Completed 事件(就像之前按下未更改的“输入”按钮时一样。

真正发生的事情:

iOS 上,代码按预期工作。但是在 Android 上没有任何反应。该事件不会被调用。

我的问题:

如何在 Android 上实现上述内容?

示例代码:

应用程序:

namespace CustomEntry
{
    public class App
    {
        public static Page GetMainPage()
        {    
            MyEntry entry = new MyEntry {
                VerticalOptions = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.CenterAndExpand,
                Placeholder = "Enter some text"
            };

            entry.Completed += delegate {
                Console.WriteLine("Completed");
            };

            return new ContentPage { 
                Content = entry,
            };
        }
    }
}

MyEntry.cs:

namespace CustomEntry
{
    public class MyEntry:Entry
    {

    }
}

MyEntryRenderer.cs(安卓):

[assembly: ExportRenderer(typeof(MyEntry), typeof(MyEntryRenderer))]
namespace CustomEntry.Android
{
    public class MyEntryRenderer:EntryRenderer
    {

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null) { 
                Control.ImeOptions = global::Android.Views.InputMethods.ImeAction.Search;
            }
        }

    }
}

MyEntryRenderer.cs(iOS):

[assembly: ExportRenderer(typeof(MyEntry), typeof(MyEntryRenderer))]
namespace CustomEntry.iOS
{
    public class MyEntryRenderer:EntryRenderer
    {

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null) {
                Control.ReturnKeyType = UIReturnKeyType.Search;
            }
        }

    }
}

最佳答案

我自己找到了解决问题的方法:

首先,我在自定义条目中添加了一个Action,以便在我按下“搜索”按钮时调用。

MyEntry.cs

namespace CustomEntry
{
    public class MyEntry:Entry
    {
        public Action SearchPressed = delegate {
        };
    }
}

然后我像这样“监听”ImeAction.Search 并调用我添加到我的自定义条目中的Action

MyEntryRenderer.cs(安卓):

[assembly: ExportRenderer(typeof(MyEntry), typeof(MyEntryRenderer))]
namespace CustomEntry.Android
{
    public class MyEntryRenderer:EntryRenderer
    {

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null) {
                Control.ImeOptions = ImeAction.Search;
                Control.EditorAction += (sender, args) => {
                    if (args.ActionId == ImeAction.Search) {
                        var entry = (AddressEntry)Element;
                        entry.SearchPressed();
                    }
                };
            }
        }

    }
}

在我使用 MyEntry 的第三个类中,我可以在按下“搜索”按钮时运行一些代码,如下所示:

var myEntry = new MyEntry();
myEntry.SearchPressed += SomeMethod;

关于android - 在自定义渲染器中更改键盘的 Xamarin.Forms.Entry 的 ImeOptions 在 Android 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27690724/

相关文章:

java - Activity 在android中动态加载xml布局

c# - CollectionView,SelectedItems ="{Binding SelectedElement, Mode=TwoWay}"不起作用

xamarin - 仅创建一个新的 Xamarin Forms 内容页面 Xaml 会使项目无法编译,因为 ContentPageViewModel 未知

ios - 如何在 Xcode/iOS 中为 UITextField 设置日期输入键盘

c - 如何在 C 中使用 libevdev 生成键盘输入

macos - 在mac终端模拟键盘按下

Android 11(仅限)FragmentManager 崩溃 - FragmentManager 已被销毁

android - 如何删除显示在 scrollView 顶部的空白

android - 仅为已删除的警报删除 AlarmManager 警报

c# - Xamarin Forms - 单击包含电子邮件地址的标签并在电子邮件应用程序中打开