2

キーボード全体ではなく小さなキーパッドのように見えるように、InputType="number" に設定されたいくつかの edittext フィールドを持つタブレット アプリケーションを作成しようとしています。これは明らかに、フィールドに数字のみを入力したいためです。

ただし、ユーザーが ENTER キーを押したかどうかを検出したいと思います。そうであれば、ソフト キーボードを閉じたいと思います。そのため、小さな下矢印ボタンを押してキーボードを非表示にするよりも簡単でアクセスしやすくなります。すべての文字を受け入れる画面上の別の編集テキストボックスに対して、これとまったく同じことを既に行っており(デフォルトのキーボードを使用)、正常に機能します。しかし、何らかの理由でテンキーからキー押下を検出しようとすると、検出できません。

だからここに私が理解できない問題があります.キーパッドにリスナーを追加すると、何も機能しません。画面に数字が表示されないようです。リスナーを削除すると、テンキーは再び正常に動作しますが、Enter キーが押されているのを聞くことができないため、ソフト キーボードを閉じることができます。

だから、ここに私が得たものがあります:

          <EditText
          android:id="@+id/NumOfAdults_EditText"
          android:layout_width="70sp"
          android:layout_height="50sp"
          android:inputType="number"
          android:textSize="20sp"
          android:textStyle="bold"
          android:gravity="center"
          android:selectAllOnFocus="true"
            />

そして、私はそれを次のように聞きます:

          var editTextBox = FindViewById<EditText>(Resource.Id.NumOfAdults_EditText);
          editTextBox.KeyPress += (intentSender, e) =>
          {
            if (e.Event.Action == KeyEventActions.Down && e.KeyCode == Keycode.Enter)
            {
                CloseSoftKeyboard();
                e.Handled = true;
            }
          };

それで、私がこれを行うと、数字入力キーが機能しなくなる理由を知っている人はいますか? inputType が number または phone に設定されていない場合、このコードは完全に正常に機能します。おかしいのは、検出内に Make.Toast を追加すると、実際にキープレスが機能しているのを確認できます (Num0-9 を表示することさえできます) が、画面上では何も機能していないようです。

4

2 に答える 2

0

アクティビティのDispatchKeyEventメソッドをオーバーライドして、次のようなコードを挿入できます。ただし、すべてのボタンを押すと呼び出されるので、できるだけ制限するようにしてください。

この例では、 etTheIdOfYourEditTextControlを、この動作を実行するフィールドの実際の名前に置き換えます。

public override bool DispatchKeyEvent(KeyEvent e)
    {
        if (this.CurrentFocus.Id == Resource.Id.etTheIdOfYourEditTextControl && (e.KeyCode == Keycode.NumpadEnter || e.KeyCode == Keycode.Enter))
        {
            InputMethodManager imm = GetSystemService(Context.InputMethodService) as InputMethodManager;
            if (imm != null)
                imm.HideSoftInputFromWindow(this.CurrentFocus.WindowToken, 0);

            return true;
        }

        return base.DispatchKeyEvent(e);
    }
于 2012-12-20T23:04:29.863 に答える