마지막 EditText에서 키보드에서 Done을 ​​누른 후 암시 적 "제출"


96

사용자 이름을 입력 한 다음 비밀번호로 이동하여 키보드에서 "완료"를 누르면 제출 버튼을 클릭 할 필요없이 로그인 양식이 자동으로 제출되는 일부 앱을 사용했습니다. 어떻게하나요?



문서에 대한 빠른 링크 : 입력 방법 작업 지정
FirstOne

답변:


185

이 시도:

레이아웃에서 다음을 입력 / 편집하십시오.

<EditText
    android:id="@+id/search_edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="text"
    android:singleLine="true"
    android:imeOptions="actionDone" />

활동에 다음을 넣으십시오 (예 : onCreate).

 // your text box
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });

submit_btnonclick 핸들러가 첨부 된 제출 버튼은 어디에 있습니까 ?


15
submit_btn.performClick();내 눈을 태우고 있습니다. Srsly? 제출 메소드를 호출하지 않는 이유는 무엇입니까?
Laurent Meyer

28
@LaurentMeyer 사용자 입력 시뮬레이션은 일반적으로 이러한 상황에서 기본 로직을 직접 호출하는 것보다 낫습니다. 예를 들어, 제출 버튼이 현재 비활성화되어있을 수 있으므로 performClick ()은 (의도 한대로) 아무 작업도 수행하지 않지만 제출 메서드를 직접 호출 한 경우 먼저 버튼이 비활성화되지 않았는지 확인해야합니다. 또한 버튼을 탭한 것처럼 "클릭"사운드를 재생합니다.
Extragorey

3
@LaurentMeyer UI에 민감한 것은 무엇을 의미합니까? 그리고 지난 6 개월 동안 5 명 이요. 그들에게 시간을 주면 사람들은 아마 저도 동의 할 것입니다. ;)
Extragorey

버튼을 다른 용도로 사용하는 UI를 변경한다고 가정 해 보겠습니다. 코드는 정말 엉망이 될 것이고 더 나쁜 것은 그러한 종류의 버그를 감지하기 위해 정말 광범위한 테스트 절차가 필요하다는 것입니다. 더 나쁜 것은 UI 구성 요소를 그러한 관행과 공유 할 때입니다.
Laurent Meyer

1
imeActionLabel내 EditText에서 사용 하는 TWIMC 는이 모든 동작을 비활성화했습니다. 조심해
Alwin Kesler

25

에서 IME 옵션을 설정해야합니다 EditText.

<EditText
    android:id="@+id/some_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Whatever"
    android:inputType="text"
    android:imeOptions="actionDone" />

그런 다음 OnEditorActionListener보기에를 추가 하여 "완료"작업을 수신합니다.

EditText editText = (EditText) findViewById(R.id.some_view);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // TODO do something
            handled = true;
        }
        return handled;
    }
});

공식 API 문서 : https://developer.android.com/guide/topics/ui/controls/text.html#ActionEvent


22

Kotlin을 사용한 간단하고 효과적인 솔루션

확장 EditText:

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->

       if (actionId == EditorInfo.IME_ACTION_DONE) {
           func()
       }

       true

    }
}

그런 다음 다음과 같은 새로운 방법을 사용하십시오.

editText.onSubmit { submit() }

submit()다음과 같은 것이 어디에 있습니까?

fun submit() {
    // call to api
}

더 일반적인 확장

fun EditText.on(actionId: Int, func: () -> Unit) {
    setOnEditorActionListener { _, receivedActionId, _ ->

       if (actionId == receivedActionId) {
           func()
       }

        true
    }
}

그런 다음이를 사용하여 이벤트를 수신 할 수 있습니다.

email.on(EditorInfo.IME_ACTION_NEXT, { confirm() })

6

이것이 수행되는 방법입니다.

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

추가하는 것을 잊지 마세요

<EditText android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:imeOptions="actionDone"/>

당신의 EditText에서 actionDone .


2

edittext 태그 내부의 XML 파일에서 아래 스 니펫을 추가하십시오.

android:imeOptions="actionDone"

그런 다음 Java 클래스 내부에 아래 코드를 작성하십시오.

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() { 


@Override 
  public boolean onEditorAction(TextView v, int id, KeyEvent event) { 
   if (id == EditorInfo.IME_ACTION_DONE) { 
      //do your work here 
      return true;
    } 

        return false; 
   } 
  });

1

edittext에 다음 줄을 추가하십시오.

android:imeOptions="actionDone"

즐거운 코딩


1
etParola = (EditText) findViewById(R.id.etParola); 
 btnGiris = (Button) findViewById(R.id.btnGiris);
  etParola.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    btnGiris.performClick();
                    return true;
                }
                return false;
            }
        });

 and;


layout xml etParola
android:imeOptions="actionDone" add

등이 정확히 같은 대답 이 하나 . 이것이 OP의 문제를 어떻게 해결한다고 생각하는지 조금 설명해야합니다.
Adrian W

1

이 대답을 확장 하십시오.

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            clearFocus() // if needed 
            hideKeyboard()
            func()
        }
        true
    }
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

0
<EditText
        android:id="@+id/signinscr_userName"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/userName"
        android:imeOptions="actionNext" />

    <EditText
        android:id="@+id/signinscr_password"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionDone"
        android:inputType="textPassword" />

.java 파일에서

EditText userNameField = (EditText) findViewById(R.id.signinscr_userName);
    EditText passwordField = (EditText) findViewById(R.id.signinscr_password);
    passwordField.setOnEditorActionListener(new OnEditorActionListener() {
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
            //Do your operation here.
            return false;
        }
    });

0
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
// which is u had set a imeoption
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.