私はカスタムキーボード付きのアプリを持っています。これを行うには、ページレンダラーを使用するので、キーボードレイアウトを扱いやすくするために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プロジェクトはかなりうまく動作しています。
あなたの 'mTargetView.FocusChange'デリゲートが理由です。 –
私はそれをコメントアウトしようとしましたが、それはまだ動作しません。 –
申し訳ありませんが、あなたの問題を再現することはできません、この問題を再現するための基本的なデモを共有しますか? –