ユーザーが押すと 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>
仮想デバイスで何か問題があるのでしょうか?
これはそれを行うはずです:
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;
}
});
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();
}
}
テキストボックスを1行にすると(レイアウトのxmlファイルではプロパティはSingleLineと呼ばれていると思います)、Enterキーを押すとキーボードから抜けます。
ここに行きます: http://developer.Android.com/reference/Android/R.styleable.html#TextView_singleLine
以下の例のように、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で使用することは可能です。
この行を編集テキストに追加するだけです。
Android:imeOptions="actionDone"'
キーボードの完了ボタンをクリックすると、その編集テキストに移動する次の編集テキストIDを指定できます。