【问题标题】:Changing keyboard's ImeOptions of Xamarin.Forms.Entry in custom renderer not working on Android在自定义渲染器中更改键盘的 Xamarin.Forms.Entry 的 ImeOptions 无法在 Android 上运行
【发布时间】:2015-02-25 17:58:20
【问题描述】:

我有什么:

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

我想要什么:

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

真正发生的事情:

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

我的问题:

我怎样才能实现我在Android 上描述的内容?

示例代码:

App.cs:

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 (Android):

[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;
            }
        }

    }
}

【问题讨论】:

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


    【解决方案1】:

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

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

    MyEntry.cs

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

    第二次我像这样“收听”ImeAction.Search 并调用我添加到自定义条目中的Action

    MyEntryRenderer.cs (Android):

    [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;
    

    【讨论】:

      【解决方案2】:

      公共类 EntryExtensionRenderer : EntryRenderer { 受保护的覆盖无效 OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e);

              if ((Element as EntryExtension).NoSuggestionsKey)
              {
                  Control.AutocorrectionType = UITextAutocorrectionType.No;
              }
      
              if ((Element as EntryExtension).ReturnKeyType.Equals("Done"))
              {
                  this.AddDoneButton("Done", (EntryExtension)Element);
              }
              else if ((Element as EntryExtension).ReturnKeyType.Equals("Next"))
              {
                  this.AddDoneButton("Next", (EntryExtension)Element);
              }
          }
      
          protected void AddDoneButton(string button, EntryExtension entry)
          {
              UIToolbar toolbar = new UIToolbar(new RectangleF(0.0f, 0.0f, 50.0f, 44.0f));
      
              var doneButton = new UIBarButtonItem();
      
              if (button.Equals("Done")) { 
                  doneButton = new UIBarButtonItem(UIBarButtonSystemItem.Done, delegate
                  {
                      entry.KeyPressedEnter();
                  });
              }
      
              if (button.Equals("Next"))
              {
                  doneButton = new UIBarButtonItem("Next", UIBarButtonItemStyle.Done, delegate
                  {
                      entry.KeyPressedEnter();
                  });
              }
      
              toolbar.Items = new UIBarButtonItem[] {
                  new UIBarButtonItem (UIBarButtonSystemItem.FlexibleSpace),
                  doneButton
              };
              this.Control.InputAccessoryView = toolbar;
          }
      
      
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-13
        • 2015-05-11
        • 1970-01-01
        • 2019-08-20
        • 2016-09-27
        • 2018-01-11
        • 2016-05-26
        • 2019-05-26
        • 2020-01-14
        相关资源
        最近更新 更多