2015-01-16 32 views
4

我們正在嘗試使用Xamarin Forms構建聊天應用程序,但我們一直在使用Android鍵盤來獲取這個惱人的錯誤。無論何時點擊「發送」按鈕,條目(用於聊天的文本框)上的焦點都將丟失,並且鍵盤消失。這不是我們想要的,所以我們加入這行來TapGestureRecognizer:鍵盤快速隱藏並使用Xamarin表單在Android上重新顯示

messageEntry.Focus(); 

但出於某種原因,這並不足夠快的發生,往往是鍵盤出現故障,立即再次。這可以防止用戶按順序快速發佈多條消息。有人知道如何解決這個問題嗎?

+0

你有沒有想出解決辦法?我遇到同樣的問題 –

+0

從未做過,也許可以使用平臺特定的API。 – gerwin

回答

1

得益於@AdamKemp在這個post的答案,這裏是我的解決方案。如果觸摸位於我的EntryStackLayout(不要忘記創建空的自定義渲染器),則我不會關閉鍵盤(如果CurrentFocusEditTextDispatchTouchEvent會執行此操作)。

public class EditorAndButtonReproPage : ContentPage 
    { 
     public EditorAndButtonReproPage() 
     { 
      BackgroundColor = Color.Gray; 
      Padding = 50; 
      var editor = new Editor {HorizontalOptions = LayoutOptions.FillAndExpand}; 
      var editorButton = new Button {Text = "OK", HorizontalOptions = LayoutOptions.End}; 
      var editorLayout = new EntryStackLayout { Orientation = StackOrientation.Horizontal, Children = { editor, editorButton}, VerticalOptions = LayoutOptions.Start}; 
      var entry = new ExtendedEntry { Placeholder = "Entry", HorizontalOptions = LayoutOptions.FillAndExpand }; 
      var entryButton = new Button { Text = "OK", HorizontalOptions = LayoutOptions.End }; 
      var entryLayout = new EntryStackLayout { Orientation = StackOrientation.Horizontal, Children = { entry, entryButton }, VerticalOptions = LayoutOptions.Start }; 
      Content = new StackLayout {Children = {editorLayout, entryLayout}}; 
     } 
    } 

,並在MainActivity

private bool _ignoreNewFocus; 
     public override bool DispatchTouchEvent(MotionEvent e) 
     { 
      var currentView = CurrentFocus; 
      var parent = currentView?.Parent?.Parent; 
      var entryStackLayout = parent as EntryStackLayout; 
      if (entryStackLayout != null) 
      { 
       var entryLayoutLocation = new int[2]; 
       entryStackLayout.GetLocationOnScreen(entryLayoutLocation); 
       var x = e.RawX + entryStackLayout.Left - entryLayoutLocation[0]; 
       var y = e.RawY + entryStackLayout.Top - entryLayoutLocation[1]; 
       var entryStackLayoutRect = new Rectangle(entryStackLayout.Left, entryStackLayout.Top, entryStackLayout.Width, entryStackLayout.Height); 
       _ignoreNewFocus = entryStackLayoutRect.Contains(x, y); 
      } 
      var result = base.DispatchTouchEvent(e); 
      _ignoreNewFocus = false; 
      return result; 
     } 

     public override Android.Views.View CurrentFocus => _ignoreNewFocus ? null : base.CurrentFocus; 
+0

你能分享一個完整的代碼嗎? – Polyariz

0

它會是一個黑客位的,但你可以分拆是等待50毫秒,然後調用主UI線程上messageEntry.Focus()行異步任務...