2017-11-14 5 views
2

私はカスタムキーボード付きのアプリを持っています。これを行うには、ページレンダラーを使用するので、キーボードレイアウトを扱いやすくするためにAndroidレイアウトを使用できます。Androidキーボードがページレンダラーのタッチに重点を失う

私はキーボードを長めに押すと(.5s)、すべて正常に機能します。私がキー(ほとんどの人が何をするのか)を素早くタップすると、キーボードの対象となるEditTextがフォーカスを失い、キーボードが隠れてカーソルがEditTextから削除されます。私はFocusChangedハンドラを設定して、ユーザが画面の他の場所をクリックしたときにキーボードを隠すようにしました。このエラーで、キーボードタップ後にFindFocusを実行すると、フォーカスはnullとして戻ります。私はクリックを受け取るゴーストビューの場合にレイアウトの境界を示しましたが、そこには何もありません。キーボードイベントでライフサイクルがどのようなものか分かりませんが、この問題を引き起こしているものはmKeyboardView.Keyの後に呼び出されます。

アイデア?ありがとう。

class KeyboardPageRenderer : PageRenderer 
{ 

    public CustomKeyboardView mKeyboardView; 
    public EditText mTargetView; 
    public Android.InputMethodServices.Keyboard mKeyboard; 
    Activity activity; 
    global::Android.Views.View view; 

    protected override void OnElementChanged(ElementChangedEventArgs<Page> e) 
    { 
     base.OnElementChanged(e); 

     if (e.OldElement != null || Element == null) 
     { 
      return; 
     } 

     try 
     { 
      SetupUserInterface(); 
      SetupEventHandlers(); 
      this.AddView(view); 
     } 
     catch (System.Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine(@"   ERROR: ", ex.Message); 
     } 
    } 

    void SetupUserInterface() 
    { 
     activity = this.Context as Activity; 
     view = activity.LayoutInflater.Inflate(Resource.Layout.Main, this, false); 

     mKeyboard = new Android.InputMethodServices.Keyboard(Context, Resource.Xml.keyboard); 
     mTargetView = view.FindViewById<EditText>(Resource.Id.target); 

     mKeyboardView = view.FindViewById<CustomKeyboardView>(Resource.Id.keyboard_view); 
     mKeyboardView.Keyboard = mKeyboard; 
    } 

    void SetupEventHandlers() 
    { 
     mTargetView.Touch += (sender, e) => 
     { 
      ShowKeyboardWithAnimation(); 
      e.Handled = false; 
      mTargetView.ShowSoftInputOnFocus = false; 
     }; 

     mTargetView.FocusChange += (sender, e) => 
     { 
      var idk = FindFocus(); 
      if (!mTargetView.IsFocused) 
      { 
       mKeyboardView.Visibility = ViewStates.Gone; 
      } 

     }; 

     mKeyboardView.Key += (sender, e) => 
     { 
      long eventTime = JavaSystem.CurrentTimeMillis(); 
      KeyEvent ev = new KeyEvent(eventTime, eventTime, KeyEventActions.Down, e.PrimaryCode, 0, 0, 0, 0, KeyEventFlags.SoftKeyboard | KeyEventFlags.KeepTouchMode); 

      DispatchKeyEvent(ev); 
     }; 
    } 


    public void ShowKeyboardWithAnimation() 
    { 
     if (mKeyboardView.Visibility == ViewStates.Gone) 
     { 
      mKeyboardView.Visibility = ViewStates.Visible; 
      Android.Views.Animations.Animation animation = AnimationUtils.LoadAnimation(
       Context, 
       Resource.Animation.slide_up_bottom 
      ); 
      mKeyboardView.ShowWithAnimation(animation); 
     } 
    } 

    protected override void OnLayout (bool changed, int l, int t, int r, int b) 
    { 
     base.OnLayout (changed, l, t, r, b); 

     var msw = MeasureSpec.MakeMeasureSpec (r - l, MeasureSpecMode.Exactly); 
     var msh = MeasureSpec.MakeMeasureSpec (b - t, MeasureSpecMode.Exactly); 

     view.Measure (msw, msh); 
     view.Layout (0, 0, r - l, b - t); 
    } 
} 

EDIT:

プロジェクト全体がhereを見つけることができます。誰もがそれを実装しようとしている場合、iOSプロジェクトはかなりうまく動作しています。

+0

あなたの 'mTargetView.FocusChange'デリゲートが理由です。 –

+0

私はそれをコメントアウトしようとしましたが、それはまだ動作しません。 –

+0

申し訳ありませんが、あなたの問題を再現することはできません、この問題を再現するための基本的なデモを共有しますか? –

答えて

1

EditText.FocusChangeメソッドを削除し、このようなあなたのCustomKeyboardView.Key方法変更:

mKeyboardView.Key += (sender, e) => 
{ 
    long eventTime = JavaSystem.CurrentTimeMillis(); 
    KeyEvent ev = new KeyEvent(eventTime, eventTime, KeyEventActions.Down, e.PrimaryCode, 0, 0, 0, 0, KeyEventFlags.SoftKeyboard | KeyEventFlags.KeepTouchMode); 

    //Make your editText get Focus 
    mTargetView.RequestFocus(); 

    DispatchKeyEvent(ev); 
}; 

Effectを。


更新:

mKeyboardView.Key += async (sender, e) => 
{ 
    long eventTime = JavaSystem.CurrentTimeMillis(); 
    KeyEvent ev = new KeyEvent(eventTime, eventTime, KeyEventActions.Down, e.PrimaryCode, 0, 0, 0, 0, KeyEventFlags.SoftKeyboard | KeyEventFlags.KeepTouchMode); 

    DispatchKeyEvent(ev); 
    await Task.Delay(1); 

    //mTargetView.RequestFocus(); 
}; 

すると、カーソルが常に表示されます:

はここに私の回避策です。

Effect like this

+0

私に戻ってくれてありがとう。 'FocusChange'コードを削除しても、キーボードから離れてキーボードを閉じることはできなくなりました。入力は間違いなく今よりうまくいくが、カーソルがうまくいかない他の文字が消えることに気付く。 編集: 'KeyboardKey'や' EditText'で使われていない領域全体を占める 'RemoveKeyboard'ビューをレイアウトに追加しました。このビューに触れたときに 'Keyboard'を隠し、キーボード隠し問題を修正しましたが、まだカーソルの問題があります。 –

+0

@WillNasby、私は自分の答えを更新しました。それを確認してください。 –

関連する問題