2017-02-21 16 views
1

Entry.unfocus/Entry.completedはキーボードを非表示にし、キャンセルする方法は?キーボードをXamarin.Formsに保持する方法は?

私はいくつかのエントリがあるページがあります。キーボード入力キーを押すと、キーボードが隠されないようにします。どのようにPCLプロジェクト(アンドロイドe iOS)でそれを行うには?

+0

これをチェック:https://forums.xamarin.com/discussion/56523/entry-cell-loses-focus-on-button-press-in-android-but-not-ios-work-around –

答えて

0

最近私は似たようなことをしました。私は、キーボードを常にページ内で開いたままにして、ボタンがクリックされたときに非表示にしないようにしたい。これを達成するために、私はiOSとAndroidの両方でさまざまな方法に従っていました。

Control.ShouldEndEditing += DisableHidingKeyboard;は、キーボードは常にカスタムエディタを中心にした後にオープンします:iOS版で

のiOS

は、私は、カスタムエディタレンダラコードのこの部分で

public class CustomEditorRenderer : EditorRenderer 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<Editor> e) 
    { 
     base.OnElementChanged(e); 

     var element = this.Element as CustomEditor; 

     Control.InputAccessoryView = null; 
     Control.ShouldEndEditing += DisableHidingKeyboard; 

     MessagingCenter.Subscribe<ReportEventDetailPage>(this, "FocusKeyboardStatus", (sender) => 
     { 

      if (Control != null) 
      { 
       Control.ShouldEndEditing += EnableHidingKeyboard; 
      } 

      MessagingCenter.Unsubscribe<ReportEventDetailPage>(this, "FocusKeyboardStatus"); 
     }); 
    } 

    private bool DisableHidingKeyboard(UITextView textView) 
    { 
     return false; 
    } 

    private bool EnableHidingKeyboard(UITextView textView) 
    { 
     return true; 
    } 
} 

を作成しました。ただし、現在のページを別のページに変更すると、キーボードは非表示になりません。この問題を解決するために、私はMessagingCenterを使用し、現在のページを解読すると、キーボードを隠すようにメッセージを送信します。

Android

Androidの場合、私はキーボードヘルパーインターフェイスを作成して実装しました。ここで

は私のインターフェイスです:Android用

public interface IKeyboardHelper 
{ 
    void ShowKeyboard(); 

    void HideKeyboard(); 
} 

キーボードヘルパークラス:現在のページのコンストラクタで

public class KeyboardHelper : IKeyboardHelper 
{ 
    public void ShowKeyboard() 
    { 
     var context = Forms.Context; 
     var inputMethodManager = context.GetSystemService(Context.InputMethodService) as InputMethodManager; 

     if (inputMethodManager != null && context is Activity) 
     { 
      var activity = context as Activity; 
      var token = activity.CurrentFocus?.WindowToken; 
      inputMethodManager.ToggleSoftInput(ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly); 
     } 
    } 

    public void HideKeyboard() 
    { 
     var context = Forms.Context; 
     var inputMethodManager = context.GetSystemService(Context.InputMethodService) as InputMethodManager; 

     if (inputMethodManager != null && context is Activity) 
     { 
      var activity = context as Activity; 
      var token = activity.CurrentFocus?.WindowToken; 
      inputMethodManager.HideSoftInputFromWindow(token, HideSoftInputFlags.None); 

      activity.Window.DecorView.ClearFocus(); 
     } 
    } 

else if (Device.OS == TargetPlatform.Android) 
{ 
    MessagingCenter.Send(this, "AndroidFocusEditor"); 
} 

と、現在のページのOnAppearing方法:

protected override void OnAppearing() 
    { 
     base.OnAppearing(); 

     if (Device.OS == TargetPlatform.Android) 
     { 
      DependencyService.Get<IKeyboardHelper>().ShowKeyboard(); 
      //EventEditor.Focus(); 

      MessagingCenter.Subscribe<ReportEventDetailPage>(this, "AndroidFocusEditor", (sender) => { 
       Device.BeginInvokeOnMainThread(async() => { 
        await Task.Run(() => Task.Delay(1)); 
        EventEditor.Focus(); 

        MessagingCenter.Unsubscribe<ReportEventDetailPage>(this, "AndroidFocusEditor"); 
       }); 
      }); 
     } 

     else if (Device.OS == TargetPlatform.iOS) 
     { 
      EventEditor.Focus(); 
     } 
    } 

最後の1つ:ユーザーがページ上の別のボタンをクリックすると、キーボードが非表示になります。これを防ぐために、私は、このリンクをたどって、あなたは、PCLからエントリをナビゲートし、次々に焦点を当て、それらを保つために素晴らしく、簡単な方法がありますことをやりたいなら、それは本当に私をたくさん

Keep Keyboard Open For Android

+0

私はこれを試して、ありがとう! – Kross

0

を助けましたその他(あなたが探しているもので、キーボードを開いたままではない場合)
ページ内に約5つのエントリがあり、ユーザがdoneまたはenterのキーを押したときにそれらを繰り返してみたいとします。

CurrentPage.FindByName<Entry>("FirstEntry").Completed += (o, args) => 
{ 
    CurrentPage.FindByName<Entry>("SecondEntry").Focus(); 
}; 
CurrentPage.FindByName<Entry>("SecondEntry").Completed += (o, args) => 
{ 
    CurrentPage.FindByName<Entry>("ThirdEntry").Focus(); 
}; 
CurrentPage.FindByName<Entry>("ThirdEntry").Completed += (o, args) => 
{ 
    CurrentPage.FindByName<Entry>("ForthEntry").Focus(); 
}; 
CurrentPage.FindByName<Entry>("ForthEntry").Completed += (o, args) => 
{ 
    CurrentPage.FindByName<Entry>("FifthEntry").Focus(); 
}; 
CurrentPage.FindByName<Entry>("FifthEntry").Completed += (o, args) => 
{ 
    //Keep going or execute your command, you got the drill.. 
}; 

あなたのViewIsAppearingInit方法にこれを追加することができます。

+0

私はこれをしましたが、キーボードも隠しています。助けてくれてありがとう。 – Kross

関連する問題