2015-03-03 4 views
4

Как скрыть экранную клавиатуру для отображения при фокусировке Entry в проекте переносных форм Xamarin.forms? Я полагаю, что мы должны написать специфичные для платформы рендеры для этого, но следующий не работает:Скрыть программную клавиатуру в Xamarin

Я создаю свой собственный вход подкласс:

public class MyExtendedEntry : Entry 
{ 
} 

, а затем в xamarin.android проекте мой рендер:

public class MyExtendedEntryRenderer : EntryRenderer 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
    { 
     base.OnElementChanged(e); 
     if (Control != null) 
     { 
      new Handler().Post(delegate 
      { 
       var imm = (InputMethodManager)Control.Context.GetSystemService(Context.InputMethodService); 
       var result = imm.HideSoftInputFromWindow(Control.WindowToken, 0); 
      }); 
     } 
    } 
} 

OnElementChanged вызывается как ожидалось, и при использовании Handler.Post() я также получаю WindowToken вместо null. К сожалению, возвращаемое значение от HideSoftInputFromWindow всегда неверно, а экранная клавиатура все же появляется при нажатии на запись.

ответ

3

OnElementChanged вызывается всякий раз, когда представление инициализируется и прикрепляется к представлению. То, что вы хотите сделать, - это скрыть клавиатуру, когда нажимается запись, поэтому вы должны добавить обработчик события FocusChange в Control.

Пример:

protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
    { 
     base.OnElementChanged(e); 
     if (Control != null) 
     { 
      Control.Click += (sender, evt) => { 
       new Handler().Post(delegate 
        { 
         var imm = (InputMethodManager)Control.Context.GetSystemService(Android.Content.Context.InputMethodService); 
         var result = imm.HideSoftInputFromWindow(Control.WindowToken, 0); 

         Console.WriteLine(result); 
        }); 
      }; 

      Control.FocusChange += (sender, evt) => { 
       new Handler().Post(delegate 
        { 
         var imm = (InputMethodManager)Control.Context.GetSystemService(Android.Content.Context.InputMethodService); 
         var result = imm.HideSoftInputFromWindow(Control.WindowToken, 0); 

         Console.WriteLine(result); 
        }); 
      }; 
     } 
    } 

Update: Комбинированный ответ от @Vikram

Обновление: Добавлено Click обработчик события

+0

К сожалению 'result' еще ложь и клавиатура отображается. – Voo

+0

Я обнаружил, что если пользователь нажмет на него второй раз, фокус не изменился, поэтому я добавил также обработчик событий Click. Я попытался использовать свою заметку 3, и она работает, и возвращается «True». –

3

Примечание: Я не разбираюсь в Xamarin.

По моему опыту, с помощью imm.HideSoftInputFromWindow(Control.WindowToken, 0) сразу после получения контроля фокус производит изворотливые результаты, даже при использовании Post. У меня был успех, используя вместо этого PostDelayed. Задержка, которую я использую, составляет 500 мс.

Дайте этому попытку:

public class MyExtendedEntryRenderer : EntryRenderer 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
    { 
     base.OnElementChanged(e); 
     if (Control != null) 
     { 
      new Handler().PostDelayed(delegate 
      { 
       var imm = (InputMethodManager)Control.Context.GetSystemService(Context.InputMethodService); 
       var result = imm.HideSoftInputFromWindow(Control.WindowToken, 0); 
      }, 500L); 
     } 
    } 
} 
+0

Я люблю тебя !!!!!!!!!!!!!!!! – SerenityNow

Смежные вопросы