답변:
나는 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;
}
isPreparedForSending()
두 번째 방법 은 무엇 이며 왜 반환 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"/>
<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.anddev 와 Alex 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
}
}
여기서 Enter
키 EditorInfo.IME_NULL
대신 확인하기 때문에 키를 확인합니다.IME_ACTION_DONE
.
Android imeOptions = "actionDone"작동하지 않음 도 참조하십시오 . 에 추가 android:singleLine="true"
하십시오 EditText
.
Kotlin에서 처리하는 기본 방법은 다음과 같습니다.
edittext.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
callback.invoke()
true
}
false
}
이것을 사용 edittext.onDone{/*action*/}
하여 메인 코드를 호출 하십시오. 코드를 훨씬 더 읽기 쉽고 유지 보수 가능하게 만듭니다.
fun EditText.onDone(callback: () -> Unit) {
setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
callback.invoke()
true
}
false
}
}
<EditText ...
android:imeOptions="actionDone"
android:inputType="text"/>
inputType="textMultiLine"
지원 이 필요하면 이 게시물을 읽으십시오
setOnEditorActionListener
. 어쩌면 로컬 구성 설정의 문제 일 수도 있지만 실제로 는 linter가 실제로 else
"block"과 리스너의 return 문으로 "true"를 허용하기 위해 분기 를 추가하기를 원합니다 if
.
Android 주석을 사용하는 경우 https://github.com/androidannotations/androidannotations
@EditorAction 주석을 사용할 수 있습니다
@EditorAction(R.id.your_component_id)
void onDoneAction(EditText view, int actionId){
if(actionId == EditorInfo.IME_ACTION_DONE){
//Todo: Do your work or call a method
}
}