ImeOptions의 완료 버튼 클릭을 어떻게 처리합니까? 키보드에 완료 버튼을

EditText사용자가 EditText를 클릭 할 때 키보드에 완료 버튼을 표시 할 수 있도록 다음 속성을 설정 하는 위치가 있습니다.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

사용자가 화면 키보드에서 완료 버튼을 클릭하면 (입력 완료) RadioButton상태 를 변경하고 싶습니다 .

화면 키보드에서 완료된 버튼을 어떻게 추적합니까?

소프트웨어 키보드의 오른쪽 하단 '완료'버튼을 보여주는 스크린 샷



답변

나는 Roberts와 chirags 답변의 조합으로 끝났습니다.

((EditText)findViewById(R.id.search_field)).setOnEditorActionListener(
        new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        // Identifier of the action. This will be either the identifier you supplied,
        // or EditorInfo.IME_NULL if being called due to the enter key being pressed.
        if (actionId == EditorInfo.IME_ACTION_SEARCH
                || actionId == EditorInfo.IME_ACTION_DONE
                || event.getAction() == KeyEvent.ACTION_DOWN
                && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
            onSearchAction(v);
            return true;
        }
        // Return true if you have consumed the action, else false.
        return false;
    }
});

업데이트 :
위의 코드는 때로는 콜백을 두 번 활성화합니다. 대신 Google 채팅 클라이언트에서 얻은 다음 코드를 선택했습니다.

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    // If triggered by an enter key, this is the event; otherwise, this is null.
    if (event != null) {
        // if shift key is down, then we want to insert the '\n' char in the TextView;
        // otherwise, the default action is to send the message.
        if (!event.isShiftPressed()) {
            if (isPreparedForSending()) {
                confirmSendMessageIfNeeded();
            }
            return true;
        }
        return false;
    }

    if (isPreparedForSending()) {
        confirmSendMessageIfNeeded();
    }
    return true;
}


답변

이것을 시도하십시오. 필요한 것에서 작동해야합니다.


editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
       //do here your stuff f
       return true;
    }
    return false;
    }
});


답변

<EditText android:imeOptions="actionDone"
          android:inputType="text"/>

Java 코드는 다음과 같습니다.

edittext.setOnEditorActionListener(new OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            Log.i(TAG,"Here you can write the code");
            return true;
        }
        return false;
    }
});


답변

나는이 질문이 오래되었다는 것을 알고 있지만 나에게 도움이 된 것을 지적하고 싶다.

Android 개발자 웹 사이트 (아래 참조) 의 샘플 코드를 사용해 보았지만 작동하지 않았습니다. 그래서 EditorInfo 클래스를 확인하고 IME_ACTION_SEND 정수 값이 다음과 같이 지정되었음을 깨달았습니다.0x00000004 .

Android 개발자의 샘플 코드 :

editTextEmail = (EditText) findViewById(R.id.editTextEmail);
editTextEmail
        .setOnEditorActionListener(new OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId,
                    KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_SEND) {
                    /* handle action here */
                    handled = true;
                }
                return handled;
            }
        });

그래서 정수 값을 res/values/integers.xml파일에 추가했습니다 .

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="send">0x00000004</integer>
</resources>

그런 다음 레이아웃 파일 res/layouts/activity_home.xml을 다음과 같이 편집했습니다.

<EditText android:id="@+id/editTextEmail"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:imeActionId="@integer/send"
  android:imeActionLabel="@+string/send_label"
  android:imeOptions="actionSend"
  android:inputType="textEmailAddress"/>

그런 다음 샘플 코드가 작동했습니다.


답변

OnKeyListener를 설정하고 완료 버튼을 수신하는 방법에 대한 자세한 내용.

먼저 클래스의 구현 섹션에 OnKeyListener를 추가하십시오. 그런 다음 OnKeyListener 인터페이스에 정의 된 함수를 추가하십시오.

/*
 * Respond to soft keyboard events, look for the DONE press on the password field.
 */
public boolean onKey(View v, int keyCode, KeyEvent event)
{
    if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
        (keyCode == KeyEvent.KEYCODE_ENTER))
    {
        // Done pressed!  Do something here.
    }
    // Returning false allows other listeners to react to the press.
    return false;
}

EditText 객체가 주어지면 :

EditText textField = (EditText)findViewById(R.id.MyEditText);
textField.setOnKeyListener(this);


답변

대부분의 사람들이이 질문에 직접 대답했지만, 그 개념에 대해 더 자세히 설명하고 싶었습니다. 먼저 기본 로그인 활동을 만들 때 IME에 주목했습니다. 다음과 같은 코드가 생성되었습니다.

<EditText
  android:id="@+id/password"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:hint="@string/prompt_password"
  android:imeActionId="@+id/login"
  android:imeActionLabel="@string/action_sign_in_short"
  android:imeOptions="actionUnspecified"
  android:inputType="textPassword"
  android:maxLines="1"
  android:singleLine="true"/>

inputType 속성에 대해 잘 알고 있어야합니다. 이것은 이메일 주소, 비밀번호 또는 전화 번호와 같이 예상되는 텍스트 유형을 Android에 알려줍니다. 가능한 값의 전체 목록은 여기 에서 찾을 수 있습니다 .

그러나 그것이 imeOptions="actionUnspecified"그 목적을 이해하지 못한 속성이었습니다 . Android를 사용하면를 사용하여 텍스트를 선택할 때 화면 하단에서 팝업되는 키보드와 상호 작용할 수 있습니다 InputMethodManager. 키보드의 하단 모서리에는 현재 텍스트 필드에 따라 일반적으로 “다음”또는 “완료”버튼이 있습니다. Android에서는을 사용하여이를 사용자 지정할 수 있습니다 android:imeOptions. “보내기”버튼 또는 “다음”버튼을 지정할 수 있습니다. 전체 목록은 여기 에서 찾을 수 있습니다 .

그런 다음 요소에 TextView.OnEditorActionListener대해 를 정의하여 작업 단추의 누름을들을 수 있습니다 EditText. 귀하의 예에서와 같이 :

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(EditText v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
       //do here your stuff f
       return true;
    }
    return false;
    }
});

이제 내 예제에서 나는 android:imeOptions="actionUnspecified"속성을 가졌다 . 사용자가 Enter 키를 누를 때 로그인을 시도 할 때 유용합니다. 활동에서이 태그를 감지 한 후 로그인을 시도 할 수 있습니다.

    mPasswordView = (EditText) findViewById(R.id.password);
    mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
            if (id == R.id.login || id == EditorInfo.IME_NULL) {
                attemptLogin();
                return true;
            }
            return false;
        }
    });


답변

Kotlin의 chikka.anddevAlex Cohn 덕분에 다음 과 같습니다.

text.setOnEditorActionListener { v, actionId, event ->
    if (actionId == EditorInfo.IME_ACTION_DONE ||
        event?.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER) {
        doSomething()
        true
    } else {
        false
    }
}

여기서 EnterEditorInfo.IME_NULL대신 확인하기 때문에 키를 확인합니다.IME_ACTION_DONE .

Android imeOptions = “actionDone”작동하지 않음 도 참조하십시오 . 에 추가 android:singleLine="true"하십시오 EditText.