Изменение Imeoptions клавиатуры xamarin.forms.entry в пользовательском рендере не работает на Android -- android поле с участием xamarin.forms поле с участием keyboard поле с участием renderer поле с участием xamarin.forms.entry пол Связанный проблема

Changing keyboard's ImeOptions of Xamarin.Forms.Entry in custom renderer not working on Android


2
vote

проблема

русский

Что у меня есть:

У меня есть пользовательский класс <код> MyEntry , полученный из <код> Xamarin.Forms.Entry и пользовательских классов рендеринга <код> MyEntryRenderer для Android и iOS.

Что я хочу:

Я хочу изменить клавиатуру "Enter" -буттон на "поиск" -буттон, изменяя <код> ImeOptions на <код> Android и <код> ReturnKeyType на <Код> iOS (см. Пример код). Когда я нажимаю изменившихся «поиск» -путтон, должен быть вызван <код> MyEntry.Completed событие (например, перед тем, как я нажал не измененную «Enter» -Button.

Что действительно происходит:

на <Код> 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], ... 0 Код работает как ожидаемый. Но на <код> 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], ... 1 ничего не происходит. Событие не вызывается.

<Сильный> Мой вопрос:

Как я могу добиться того, что я описал выше на <Код> 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], ... 2 ?

<Сильный> Примерный код:

app.cs:

 <код> 'local' => [             'driver' => 'local',             'root' => storage_path('app'),         ],          'public' => [             'driver' => 'local',             'root' => storage_path('app/public'),             'url' => env('APP_URL').'/storage',             'visibility' => 'public',         ], ... 3  

myentry.cs:

 <код> 'local' => [             'driver' => 'local',             'root' => storage_path('app'),         ],          'public' => [             'driver' => 'local',             'root' => storage_path('app/public'),             'url' => env('APP_URL').'/storage',             'visibility' => 'public',         ], ... 4  

myentryrenderer.cs (Android):

 <код> 'local' => [             'driver' => 'local',             'root' => storage_path('app'),         ],          'public' => [             'driver' => 'local',             'root' => storage_path('app/public'),             'url' => env('APP_URL').'/storage',             'visibility' => 'public',         ], ... 5  

myentryrenderer.cs (iOS):

 <код> 'local' => [             'driver' => 'local',             'root' => storage_path('app'),         ],          'public' => [             'driver' => 'local',             'root' => storage_path('app/public'),             'url' => env('APP_URL').'/storage',             'visibility' => 'public',         ], ... 6  
Английский оригинал

What I have:

I have a custom class MyEntry derived from Xamarin.Forms.Entry and custom renderer classes MyEntryRenderer for Android and iOS.

What I want:

I want to change the keyboard's "enter"-button to a "search"-button by changing ImeOptions on Android and ReturnKeyType on iOS (see sample code). When I press the altered "search"-button, the MyEntry.Completed event should be called (like before when I pressed the un-altered "enter"-button.

What really happens:

On iOS the code works like expected. But on Android nothing happens. The event doesn't get called.

My question:

How can I achieve what I described above on Android?

Sample code:

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;             }         }      } } 
</div
              

Список ответов

4
 
vote
vote
Лучший ответ
 

Я нашел обходной путь для моей проблемы сам:

Сначала добавил <код> $user = User::find(Auth::user()->id);2 на мой пользовательский вход, который будет называться, когда я нажимаю на мой «поиск» -буттон.

myentry.cs

 <код> $user = User::find(Auth::user()->id);3  

Второе я "слушаю" для <Код> $user = User::find(Auth::user()->id);4 Как это и вызовите <код> $user = User::find(Auth::user()->id);5 i добавил в мою пользовательскую запись.

myentryrenderer.cs (Android):

 <код> $user = User::find(Auth::user()->id);6  

в третьем классе, где я использую <Код> $user = User::find(Auth::user()->id);7 Я могу запустить код, когда "поиск" -Button нажата так:

 <код> $user = User::find(Auth::user()->id);8  
 

I found a workaround for my problem myself:

First I added an Action to my custom entry to be called when I press my "search"-button.

MyEntry.cs

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

Second I "listen" for ImeAction.Search like this and call the Action I added to my custom 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 = ImeAction.Search;                 Control.EditorAction += (sender, args) => {                     if (args.ActionId == ImeAction.Search) {                         var entry = (AddressEntry)Element;                         entry.SearchPressed();                     }                 };             }         }      } } 

In a third class where I use MyEntry I can run some code when the "search"-button is pressed like this:

var myEntry = new MyEntry(); myEntry.SearchPressed += SomeMethod; 
</div
 
 
0
 
vote

Открытый класс AnlicextensionRenderer: Andrenderer { Защищенное переопределение пустоты на одновременном виде (ElementChangedeventargs e) { base.onelementChanged (E);

 <код> $user = User::find(Auth::user()->id);9  
 

public class EntryExtensionRenderer : EntryRenderer { protected override void 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;     }   } 
</div
 
 

Связанный проблема

3  Возможно ли совместное использование экрана в Cordova?  ( Is screen sharing possible in cordova ) 
Я использую Opentok для видеочата и совместного использования экрана. Это отлично работает для меня на браузере. Однако мое приложение также бежит в родом с и...

6  Android Gridlayout API 21  ( Android gridlayout api 21 ) 
Я пытаюсь сделать что-то вроде этого: В настоящее время я вручную устанавливаю ширину плиток, равных половине ширины экрана. Это работает хорошо, но он д...

2  Держите текущую страницу, представленную, пока на следующей странице не загружена  ( Keep current page rendered until the next page is loaded ) 
У меня есть простое приложение, которое основано на WebView.loadurl (« http://www.example.com "). Когда пользователь нажимает на URL, поведение по умолчани...

1  Пункт меню Текст не отображается в DOWELAPPBAR  ( Menu item text not showing in bottomappbar ) 
Я пытался добавить заголовок пункт меню вместе с значком меню в нижней панели приложений в Android-студии. Я пытался установить: <код> app:showAsAction="ifR...

3  Как установить Gridlines в GridView в Android  ( How to set gridlines to a gridview in android ) 
Я использую GridView, чтобы показать сводный отчет о 3 столбцах в моем приложении. Кажется, все работает нормально, за исключением пропущенных скремок GridVie...

0  Кэшинга не работала на работе при добавлении интернет-соединения перехвата (модернизация 2 - Android)  ( Caching didnt work work when adding internet connection interceptor retrofit 2 ) 
Я пытаюсь реализовать интернет-соединение перехватчика с кэшированием с помощью модернизации и OKHTTP. Кэширование работает нормально, не добавляя интернет-...

0  ONITEMSELUCTERLISTENER не выходит, когда я выбираю то же предыдущее значение  ( Onitemselectedlistener is not fired when i select the same previous value ) 
Когда я снова выбираю то же значение, которое в адаптере значения не обновляются и даже OnitEmseLectedListener или NothingsElected не выдержаны Вот следует ...

1  Обновить и загрузить один конкретный фрагмент предыдущего действия  ( Refresh and load one particular fragment of the previous activity ) 
У меня есть 3 фрагмента в активности. Один из фрагментов отображает список предметов вместе с ценой и количеством. При выборе любого элемента появится новое д...

2  Как получить направление на кратчайший путь внешнего круга в Google Maps Android, когда мое текущее местоположение находится внутри 2 или более кругов?  ( How to get direction to the shortest path outside circle in google maps android ) 
Как получить направление к ближайшему расположению внешний круг, если голубые точки - текущее местоположение? 1 [ 1 и как отображать маркеры только во...

0  Вставить арабский с помощью PDO не работает  ( Insert arabic using pdo is not working ) 
Я очень глубоко укорую в этом и посмотрите много вопросов, и это не работает Каждый раз, когда я пытаюсь вставить арабский, он показывает так (?????) <Сильн...

4  Как получить местное видео URI для Exoplayer 2.x  ( How to get local video uri for exoplayer 2 x ) 
У меня есть видеофайл Dog.mp4 в res/raw папка, который я хочу играть с экзоплом. Я пытаюсь выяснить, как получить видео URI для этой строки кода из Руководс...

0  Как использовать матрицу для изменения размера растрового изображения в SurfaceView?  ( How do i use a matrix to resize a bitmap in surfaceview ) 
Я нашел этот бит кода на Подобный вопрос , но я не могу понять, как его использовать. <код> Resizing a Bitmap: public Bitmap getResizedBitmap(Bitmap bm, i...

25  Почему приложение умирает случайным образом?  ( Why application is dying randomly ) 
Я разрабатываю приложение для музыкального проигрывателя. Все работает нормально, за исключением внезапно умирает приложение. Иногда это происходит, когда при...

6  Android Soundpool HeapSize Переполнение  ( Android soundpool heapsize overflow ) 
Я получаю эту ошибку сотни раз, когда я бегу в отладку, это, похоже, не влияет на программу, но как мне избавиться от этого? Я знаю, что его можно проследит...

2  Распознавание речи Android не подключено к службе распознавания  ( Android speech recognizer not connected to the recognition service ) 
Я хочу ввести функцию постоянного распознавания голоса в моем приложении Android. Я осознаю тот факт, что распознавание голоса время от времени зависает от ...

Связанный проблема

3  Возможно ли совместное использование экрана в Cordova? 
6  Android Gridlayout API 21 
2  Держите текущую страницу, представленную, пока на следующей странице не загружена 
1  Пункт меню Текст не отображается в DOWELAPPBAR 
3  Как установить Gridlines в GridView в Android 
0  Кэшинга не работала на работе при добавлении интернет-соединения перехвата (модернизация 2 - Android) 
0  ONITEMSELUCTERLISTENER не выходит, когда я выбираю то же предыдущее значение 
1  Обновить и загрузить один конкретный фрагмент предыдущего действия 
2  Как получить направление на кратчайший путь внешнего круга в Google Maps Android, когда мое текущее местоположение находится внутри 2 или более кругов? 
0  Вставить арабский с помощью PDO не работает 
4  Как получить местное видео URI для Exoplayer 2.x 
0  Как использовать матрицу для изменения размера растрового изображения в SurfaceView? 
25  Почему приложение умирает случайным образом? 
6  Android Soundpool HeapSize Переполнение 
2  Распознавание речи Android не подключено к службе распознавания