web-dev-qa-db-ja.com

android Enterを押すとキーボードが非表示に設定されます(EditText内)

ユーザーが押すと Enter 仮想Android "user validate entry!"キーボードで私のキーボードは表示されたままです!(なぜですか?)

ここに私のJavaコード...

private void initTextField() {
    entryUser = (EditText) findViewById(R.id.studentEntrySalary);
    entryUser.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_DPAD_CENTER:
                    case KeyEvent.KEYCODE_ENTER:
                        userValidateEntry();
                        return true;
                }
            }

          return true;
        }
    });
}

private void userValidateEntry() {
    System.out.println("user validate entry!");
}

...ここに私のビュー

 <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:layout_width="wrap_content" Android:layout_height="wrap_content">
            <EditText Android:id="@+id/studentEntrySalary" Android:text="Foo" Android:layout_width="wrap_content" Android:layout_height="wrap_content" />
 </LinearLayout>

仮想デバイスで何か問題があるのでしょうか?

27
Martin Magakian

これはそれを行うはずです:

yourEditTextHere.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(TextView v, int actionId,
                KeyEvent event) {
            if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
                InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

                // NOTE: In the author's example, he uses an identifier
                // called searchBar. If setting this code on your EditText
                // then use v.getWindowToken() as a reference to your 
                // EditText is passed into this callback as a TextView

                in.hideSoftInputFromWindow(searchBar
                        .getApplicationWindowToken(),
                        InputMethodManager.HIDE_NOT_ALWAYS);
               userValidateEntry();
               // Must return true here to consume event
               return true;

            }
            return false;
        }
    });
68
jqpubliq

SingleLine = "true"を維持し、imeOptions = "actionDone"をEditTextに追加します。次に、OnEditorActionListenerでactionId == EditorInfo.IME_ACTION_DONEかどうかを確認します(ただし、実装に変更します)。

if (actionId == EditorInfo.IME_ACTION_DONE) {

                if ((username.getText().toString().length() > 0)
                        && (password.getText().toString().length() > 0)) {
                    // Perform action on key press
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(username.getWindowToken(),
                            0);
                    doLogin();
                }
            }
18
Micha Okkerman

テキストボックスを1行にすると(レイアウトのxmlファイルではプロパティはSingleLineと呼ばれていると思います)、Enterキーを押すとキーボードから抜けます。

ここに行きます: http://developer.Android.com/reference/Android/R.styleable.html#TextView_singleLine

5
Hans

以下の例のように、AutoCompleteTextViewを拡張するカスタムコンポーネントを作成しています。

public class PortugueseCompleteTextView extends AutoCompleteTextView {
...
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (event != null &&  (event.getKeyCode() == KeyEvent.KEYCODE_BACK)) {
        InputMethodManager inputManager =
                (InputMethodManager) getContext().
                        getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(
                this.getWindowToken(),
                InputMethodManager.HIDE_NOT_ALWAYS);
    }
    return super.onKeyPreIme(keyCode, event);
}

AlertDialog.Builderでこのコードを使用していますが、Activityで使用することは可能です。

1
Ricardo Ruas

この行を編集テキストに追加するだけです。

Android:imeOptions="actionDone"'

キーボードの完了ボタンをクリックすると、その編集テキストに移動する次の編集テキストIDを指定できます。

0
Satyajit Das