Android-EditText에서 "Enter"처리


459

사용자가 누르는 것을 처리하는 방법이 있는지 궁금합니다. EnterEditTextonSubmit HTML 이벤트와 같은 을 입력하는 동안 .

또한 "완료"단추에 다른 것으로 레이블이 지정되어 (예 : "이동") 가상 키보드를 조작하고 클릭 할 때 (onSubmit과 같은) 특정 조치를 수행하는 방법이 있는지 궁금합니다.


1
Kotlin & Extensions : 여기를 살펴보십시오 : stackoverflow.com/a/48810268/1912924
— Francesco Donzello 2012

답변:


374

EnteronSubmit HTML 이벤트와 같은 EditText를 입력하는 동안 사용자가 처리하는 방법이 있는지 궁금합니다 .

예.

또한 "완료"단추에 다른 것으로 레이블이 지정되어 (예 : "이동") 가상 키보드를 조작하고 클릭 할 때 (onSubmit과 같은) 특정 조치를 수행하는 방법이 있는지 궁금합니다.

또한 그렇습니다.

android:imeActionId및 android:imeOptions속성과 setOnEditorActionListener()메소드 를 확인하고 싶을 것입니다 .TextView .

"완료"단추의 텍스트를 사용자 정의 문자열로 변경하려면 다음을 사용하십시오.

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

26
(PS EditText는 TextView를 확장하므로 왜보아야 할 속성이 TextView에 있는지-마지막 문장을 처음 읽을 때 이중 테이크를 수행했습니다 :))
— Ricket

15
참고로. 모든 키보드가 표준 android : imeOptions 속성을 지원하지는 않습니다. 정말 dissapointing입니다. 예를 들어, IME_ACTION_DONE은 6으로 정의되며 HTC 기본 키보드 (Incredible, Evo 4G와 같은 전화기에서) 리턴 키는 0으로 정의됩니다.
— fernferret

13
또한 imeOptions를 사용하는 경우 inputType = "text"또는 이와 동등한 것을 사용하십시오. 키보드가 당신의 말을 잘 들리게하기 위해! Nexus1
— Blundell

6
"예"-이것보다 더 설명해 주시겠습니까? 그는 솔루션을 구현하는 방법을 묻습니다.
— Al Wang

4
@AlWang : 먼저, 관심 영역이 답변에 포함됩니다 ( "당신이 원할 것입니다 ..."로 시작). 둘째,이 답변은 6 년 전의 답변 이므로 OP의 문제가 해결 된 것으로 추정됩니다. 결국 OP는 대답을 받아 들였습니다.
— CommonsWare

267
final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});

1
어떤 이유로 enter편집 텍스트를 클릭 하면 전체 편집 텍스트가 아래로 이동합니다. 어떻게 해결할 수 있습니까?
— Ruchir Baronia 2

1
@RuchirBaronia EditText에 android : maxLines = "1"을 추가하십시오. EditText는 "아래로 이동"하지 않고 입력 한 텍스트에 줄 바꿈을 삽입합니다. maxLines를 1로 설정하면 줄 바꿈이 삽입되지 않습니다.
— lustig

3
이 솔루션은 하드웨어 키보드에서만 작동하며 소프트 / 가상 키보드에서는 작동하지 않습니다. 그것에 의존하면 키보드가 연결되지 않은 사용자의 경우 앱이 손상됩니다.
— user3562927

12
CommonsWare, 그러나 그의 RTFM 응답에 악의는 없었다 방법 을 수행하는 방법을 정확히 보여주는 간단한 예제보다 유용합니다. 감사합니다!
— AutonomousApps

1
@AutonomousApps, 나는 종종 CommonsWare 답변을 볼 수 있습니다. 그는 안드로이드가 시작된 2009 년 이래로 운이 좋았습니다. 대개 코드없이 "예", "아니오", "불가능"등이 있습니다. 종종 그의 답변은 구식이므로, 나는 그의 추천을 따르지 않습니다.
— CoolMind

215

여기 당신이하는 일이 있습니다. 또한 Android 개발자의 샘플 코드 'Bluetooth Chat'에 숨겨져 있습니다. "example" 이라고 굵게 표시된 부분은 자신의 변수 및 방법으로 바꾸십시오.

먼저 필요한 것을 메인 액티비티로 가져 와서 리턴 버튼으로 특별한 작업을 수행하십시오.

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

이제 리턴 키에 대해 TextView.OnEditorActionListener 유형의 변수를 작성하십시오 (여기서는 exampleListener 사용 ).

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

그런 다음 리턴 버튼을 누를 때 수행 할 작업에 대해 리스너에게 두 가지를 알려야합니다. 우리가 말하는 EditText (여기서는 exampleView 사용 )를 알아야하며 Enter 키를 누를 때 무엇을 해야하는지 알아야합니다 (여기서는 example_confirm () ). 이것이 활동의 ​​마지막 또는 유일한 EditText 인 경우 제출 (또는 확인, 확인, 보내기, 저장 등) 단추의 onClick 메소드와 동일한 작업을 수행해야합니다.

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

마지막으로 리스너를 설정하십시오 (대부분의 onCreate 메소드에서).

exampleView.setOnEditorActionListener(exampleListener);

20
좋습니다. EditorInfo.IME_ACTION_SEND를 사용했으며 XML에 android : imeOptions = "actionSend"가 있습니다.
— Bani

EditorInfo.IME_ACTION_SEND를 찾는 것은 나 (에뮬레이터)에 아무런 영향을 미치지 않으므로 절대 방아쇠로 KeyEvent.KEYCODE_ENTER도 찾았습니다. 여기를 참조하십시오 : stackoverflow.com/questions/2004344/…
— 누군가 어딘가에

4
에 대한 작업을 수행하는 것이 일반적으로 좋습니다 KeyEvent.ACTION_UP. 이것이 작동하려면 먼저 ACTION_DOWN이벤트를 소비해야합니다 if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }.. 그런 다음 ACTION_UP이벤트를 확인 하고 작업을 수행 할 수 있습니다 (위의 답변과 유사). ACTION_DOWN이벤트를 소비하지 않으면을 (를) onEditorAction호출하지 않습니다 ACTION_UP.
— ashughes

2
이것은 나를 위해 일한 것입니다 : if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}-다른 접근법을 사용할 수 없었습니다
— Jonathan Ellis

38

하드웨어 키보드는 항상 입력 이벤트를 생성하지만 소프트웨어 키보드는 singleLine EditText에서 다른 actionID와 null을 반환합니다. 이 코드는 사용자가 EditText 또는 키보드 유형에 관계없이이 리스너가 설정된 EditText에서 enter를 누를 때마다 응답합니다.

import android.view.inputmethod.EditorInfo;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.


    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

singleLine = false에서 enter 키의 기본 모양은 구부러진 화살표 enter 키패드를 제공합니다. 마지막 EditText에서 singleLine = true이면 키는 DONE으로 표시되고 EditText에서는 NEXT로 표시됩니다. 기본적으로이 동작은 모든 바닐라, Android 및 Google 에뮬레이터에서 일관됩니다. scrollHorizontal 속성은 차이가 없습니다. 소프트 입력에 대한 전화의 응답이 제조업체에 남겨지고 에뮬레이터에서도 바닐라 레벨 16 에뮬레이터가 여러 줄의 긴 소프트 입력에 응답하고 actionId가 NEXT이고 이벤트.


Java를 업그레이드하면 Android 툴 체인이 고장났습니다. 32 비트였습니다. 모든 것을 64 비트로 다시 설치하고 더 많은 공개 에뮬레이터 버전이 있음을 발견했습니다. EditorActionListener의 동작이 테스트 한 에뮬레이터에서 일관됨을 알고 있음을 인정해야합니다.
— earlcasper

내가 이것을 내 블로그에 게시했을 때 누군가가 일식에서 작동하게하려면 android : imeOptions =”actionGo”를 추가하여 기본 ime 작업을 변경해야한다고 언급했습니다.
— earlcasper

내 블로그 게시물의 댓글을 잘못 읽었습니다. 이클립스에서 작동하게하려면 android : imeOptions =”actionGo”를 추가하여 기본 ime 액션을 변경해야합니다. 레이아웃 xml의 'EditText'에.
— earlcasper

내 마지막 의견은 개미와 이클립스 둘 다에 대해 언급합니다
— earlcasper

27

이 페이지는이를 수행하는 방법을 정확하게 설명합니다.

https://developer.android.com/training/keyboard-input/style.html

android : imeOptions 를 설정 한 다음 actionId를 확인하십시오. 를 . 따라서 imeOptions를 'actionDone'으로 설정하면 onEditorAction에서 'actionId == EditorInfo.IME_ACTION_DONE'을 확인합니다. 또한 android : inputType을 설정하십시오.

위에 링크 된 예제의 EditText는 다음과 같습니다.

<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

setImeOptions (int) 함수를 사용하여 프로그래밍 방식으로이를 설정할 수도 있습니다. 위에 링크 된 예제의 OnEditorActionListener는 다음과 같습니다.

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

21

나는 이것이 1 살이라는 것을 알고 있지만, 이것이 EditText에 완벽하게 작동한다는 것을 알았습니다.

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

텍스트와 공간을 제외한 모든 것을 방지합니다. 탭하거나 "반환"( "\ n") 또는 다른 항목을 사용할 수 없습니다.


IME_ACTION_DONE의 추가와 함께, 나를 위해 일한
— htafoya

1
"Enter"키를 비활성화하려면 완벽하게 작동합니다.
— deeJ

16

Chad의 응답에 대한 부록 (거의 완벽하게 작동했습니다)과 마찬가지로 코드가 두 번 (키 업 및 키 다운 한 번) 실행되지 않도록 KeyEvent 작업 유형을 확인해야한다는 것을 알았습니다. 행사).

if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
    // your code here
}

동작 이벤트 반복 (Enter 키 보유) 등에 대한 정보는 http://developer.android.com/reference/android/view/KeyEvent.html 을 참조 하십시오 .


16

나는 비슷한 목적을 가졌다. TextView를 확장하는 AutoCompleteTextView에서 키보드 (사용자 지정하려는)의 "Enter"키를 눌러 해결하려고합니다. 위와 다른 솔루션을 시도했지만 작동하는 것 같습니다. 그러나 SwiftKey 3 (완벽하게 작동 함)에서 표준 Android 키보드 (리스너의 코드를 처리하는 대신 새로운 줄이 있음)에서 장치의 입력 유형 (AOKP ROM이 장착 된 Nexus 4)을 전환 할 때 약간의 문제가 발생했습니다. 이 문제를 처리하는 데 시간이 걸렸지 만 사용하는 입력 유형에 관계없이 모든 상황에서 작동하는지는 알 수 없습니다.

여기 내 해결책이 있습니다.

xml에서 TextView의 입력 유형 속성을 "text"로 설정하십시오.

android:inputType="text"

키보드에서 "Enter"키 레이블을 사용자 정의하십시오.

myTextView.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

OnEditorActionListener를 TextView로 설정하십시오.

myTextView.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event)
    {
    boolean handled = false;
    if (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

        handled = true;
    }
    return handled;
    }
});

나는 이것이 다른 사람들이 내가 가진 문제를 피하는 데 도움이되기를 바랍니다.


불행히도 이것은 SwiftKey의 새로운 버전 4에서는 작동하지 않습니다. 그리고 ... 너트 다시 날 운전 것 : - /
— kaolick

3
귀하의 IF가 잘못되었습니다. 사용 : 'event.getKeyCode () == KeyEvent.KEYCODE_ENTER'
— LODA

나 한테 딱이야. 또한 IF 문에 setImeActionLabel을 다시 삽입해야합니다. 그렇지 않으면 사용자 정의 텍스트는 처음 누른 후에 사라집니다.
— Steve Rogers

그는 D는 위의 KeyEvent.KEYCODE_ENTER 자신의 actionId을 설정하지만 예를 다른 사람들이 아마 event.getKeyCode () == KeyEvent.KEYCODE_ENTER 사용할 것이기 때문에 그의 IF는 정확
— 레이 Hulha

15

XML에서 imeOptions 속성을 editText에 추가하십시오.

<EditText
    android:id="@+id/edittext_additem"
    ...
    android:imeOptions="actionDone"
    />

그런 다음 Java 코드에서 OnEditorActionListener를 동일한 EditText에 추가하십시오.

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

다음은 설명입니다. imeOptions = actionDone은 "actionDone"을 EnterKey에 할당합니다. 키보드의 EnterKey가 "Enter"에서 "Done"으로 변경됩니다. 따라서 Enter 키를 누르면이 동작이 트리거되어 처리하게됩니다.


9

당신도 할 수 있습니다 ..

editText.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getKeyCode() ==       KeyEvent.KEYCODE_ENTER) 
                {
                    Log.i("event", "captured");

                    return false;
                } 

            return false;
        }
    });

어떤 이유로 enter편집 텍스트를 클릭 하면 전체 편집 텍스트가 아래로 이동합니다. 어떻게 해결할 수 있습니까?
— Ruchir Baronia 2

난 당신이 배우고 싶은 생각 stackoverflow.com/questions/10978038/...이 저에게 당신의 XML을 보여 othewise
— 자 와드 Hogan 박사

6
     password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                submit.performClick();
                return true;
            }
            return false;
        }
    });

나를 위해 매우 잘 작동합니다
. 또한 키보드 숨기기


5

먼저 EditText가 키 누름을 청취하도록 설정해야합니다.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    // Set the EditText listens to key press
    EditText edittextproductnumber = (EditText) findViewById(R.id.editTextproductnumber);
    edittextproductnumber.setOnKeyListener(this);

}

둘째, 키를 누르면 이벤트를 정의하여 예를 들어 TextView의 텍스트를 설정하십시오.

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

 // Listen to "Enter" key press
 if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
 {
     TextView textviewmessage = (TextView) findViewById(R.id.textViewmessage);
     textviewmessage.setText("You hit 'Enter' key");
     return true;
 }

return false;   

}

마지막으로 EditText, TextView, OnKeyListener, KeyEvent를 맨 위에 가져 오는 것을 잊지 마십시오.

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;

5

완벽하게 작동

public class MainActivity extends AppCompatActivity {  
TextView t;
Button b;
EditText e;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b = (Button) findViewById(R.id.b);
    e = (EditText) findViewById(R.id.e);

    e.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            if (before == 0 && count == 1 && s.charAt(start) == '\n') {

                b.performClick();
                e.getText().replace(start, start + 1, ""); //remove the <enter>
            }

        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable s) {}
    });

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            b.setText("ok");

        }
    });
}

}

완벽하게 작동


5
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId != 0 || event.getAction() == KeyEvent.ACTION_DOWN) {
                // Action
                return true;
            } else {
                return false;
            }
        }
    });

Xml

<EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionGo|flagNoFullscreen"
        android:inputType="textPassword"
        android:maxLines="1" />

4

이 작동합니다

input.addTextChangedListener(new TextWatcher() {

           @Override
           public void afterTextChanged(Editable s) {}

           @Override    
           public void beforeTextChanged(CharSequence s, int start,
             int count, int after) {
           }

           @Override    
           public void onTextChanged(CharSequence s, int start,
             int before, int count) {
               if( -1 != input.getText().toString().indexOf( "\n" ) ){
                   input.setText("Enter was pressed!");
                    }
           }
          });

4

필요한 코드를 가져올 수 있도록 편집기에이 코드를 입력하십시오.

 query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });

query = EditText 필드 이름과 EditText의 xml에-> (android : imeOptions = "actionSearch")를 추가하십시오.
— Sanjit Prasad 2016 년

3

이것은 LG 안드로이드 폰에서 잘 작동합니다. ENTER다른 특수 문자가 일반 문자로 해석되는 것을 방지 합니다. Next또는 Done버튼이 자동으로 나타나고 ENTER예상대로 작동합니다.

edit.setInputType(InputType.TYPE_CLASS_TEXT);

이것은 나를 위해 일한 유일한 것입니다. Motorola Moto X 2가 있으며 일반적으로 화살표와 모든 항목이 포함 된 "Return"키가 있습니다. 이것은 체크 표시로 바뀌었고 마침내 청취자가 그 작업을 할 수있었습니다. (방금 새 줄을 만들기 전에). 그래서 다른 누군가가 그 문제를 겪고 있다면 ...
— mystic cola

2

다음 은 사용자가 하드웨어 또는 소프트웨어 키보드에서 리턴 키를 눌렀을 때 코드를 실행하는 클래스 Utils또는 Keyboards클래스에 던질 수있는 간단한 정적 함수입니다 . @earlcasper의 훌륭한 답변의 수정 된 버전입니다.

 /**
 * Return a TextView.OnEditorActionListener that will execute code when an enter is pressed on
 * the keyboard.<br>
 * <code>
 *     myTextView.setOnEditorActionListener(Keyboards.onEnterEditorActionListener(new Runnable()->{
 *         Toast.makeText(context,"Enter Pressed",Toast.LENGTH_SHORT).show();
 *     }));
 * </code>
 * @param doOnEnter A Runnable for what to do when the user hits enter
 * @return the TextView.OnEditorActionListener
 */
public static TextView.OnEditorActionListener onEnterEditorActionListener(final Runnable doOnEnter){
    return (__, actionId, event) -> {
        if (event==null) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // Capture soft enters in a singleLine EditText that is the last EditText.
                doOnEnter.run();
                return true;
            } else if (actionId==EditorInfo.IME_ACTION_NEXT) {
                // Capture soft enters in other singleLine EditTexts
                doOnEnter.run();
                return true;
            } else {
                return false;  // Let system handle all other null KeyEvents
            }
        } else if (actionId==EditorInfo.IME_NULL) {
            // Capture most soft enters in multi-line EditTexts and all hard enters.
            // They supply a zero actionId and a valid KeyEvent rather than
            // a non-zero actionId and a null event like the previous cases.
            if (event.getAction()==KeyEvent.ACTION_DOWN) {
                // We capture the event when key is first pressed.
                return true;
            } else {
                doOnEnter.run();
                return true;   // We consume the event when the key is released.
            }
        } else {
            // We let the system handle it when the listener
            // is triggered by something that wasn't an enter.
            return false;
        }
    };
}

여기에는 Java 1.8이 필요한 람다식이 사용되지만 람다를 사용하지 않도록 변환하기에는 쉽습니다. 그러나 이러한 유형의 솔루션에서 본 문제는 가상 키보드가 자동 숨기기가 아니며 전체 화면 모드 (가로 방향의 작은 장치) 인 경우 Enter 또는 DONE
— jk7을

2

textCommonsWare가 말한 것을 수행하기 위해 텍스트 필드의 InputType이 있어야합니다 . 시험판 전에 입력 유형이없고 아무것도 작동하지 않았으므로 Enter를 모두 소프트 입력으로 계속 등록하십시오. 후에 inputType = textsetImeLabel을 포함한 모든 것이 작동했습니다.

예 : android:inputType="text"


2
   final EditText edittext = (EditText) findViewById(R.id.edittext);
    edittext.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                // Perform action on key press
                Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

1

EditText에서 <enter>에 응답하는 신뢰할 수있는 방법은 TextWatcher , LocalBroadcastManager 및 BroadcastReceiver를 사용하는 것 입니다. LocalBroadcastManager를 사용하려면 v4 지원 라이브러리 를 추가해야합니다 . vogella.com 의 튜토리얼을 사용합니다 . 7.3 "LocalBroadcastManager를 사용한 로컬 브로드 캐스트 이벤트"는 완전한 간결한 코드 예제로 인해 제공됩니다. onTextChanged 년 전 입니다 변화의 끝의 인덱스 변경 전 >, 빼기 시작합니다. TextWatcher에서 UI 스레드가 editText의 편집 가능을 업데이트하는 중이므로 UI ​​스레드가 editText 업데이트를 완료하면 BroadcastReceiver를 깨우기 위해 Intent를 보냅니다.

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.Editable;
//in onCreate:
editText.addTextChangedListener(new TextWatcher() {
  public void onTextChanged
  (CharSequence s, int start, int before, int count) {
    //check if exactly one char was added and it was an <enter>
    if (before==0 && count==1 && s.charAt(start)=='\n') {
    Intent intent=new Intent("enter")
    Integer startInteger=new Integer(start);
    intent.putExtra("Start", startInteger.toString()); // Add data
    mySendBroadcast(intent);
//in the BroadcastReceiver's onReceive:
int start=Integer.parseInt(intent.getStringExtra("Start"));
editText.getText().replace(start, start+1,""); //remove the <enter>
//respond to the <enter> here

text * 입력 유형 (예 android:inputType="textCapSentences":)을 사용하는 경우 캐리지 리턴이 입력에서 필터링되므로 사용자가 Enter 키를 누를 때 onTextChanged ()가 호출되지 않습니다.
— jk7

1

이 질문은 아직 Butterknife와 함께 답변되지 않았습니다

레이아웃 XML

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/some_input_hint">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/textinput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionSend"
            android:inputType="text|textCapSentences|textAutoComplete|textAutoCorrect"/>
    </android.support.design.widget.TextInputLayout>

자바 APP

@OnEditorAction(R.id.textinput)
boolean onEditorAction(int actionId, KeyEvent key){
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND || (key.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
        //do whatever you want
        handled = true;
    }
    return handled;
}

TextInputLayout 및 Butterknife : 승리!
— Javi

1

Kotlin을 사용하여 키보드를 포함하여 EditText에 대한 모든 종류의 "완료"와 유사한 작업을 처리하는 기능을 만들었으며 원하는대로 키보드를 수정하고 다른 키도 처리 할 수 ​​있습니다.

private val DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_DONE)
private val DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)

fun EditText.setOnDoneListener(function: () -> Unit, onKeyListener: OnKeyListener? = null, onEditorActionListener: TextView.OnEditorActionListener? = null,
                               actionsToHandle: Collection<Int> = DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT,
                               keysToHandle: Collection<Int> = DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT) {
    setOnEditorActionListener { v, actionId, event ->
        if (onEditorActionListener?.onEditorAction(v, actionId, event) == true)
            return@setOnEditorActionListener true
        if (actionsToHandle.contains(actionId)) {
            function.invoke()
            return@setOnEditorActionListener true
        }
        return@setOnEditorActionListener false
    }
    setOnKeyListener { v, keyCode, event ->
        if (onKeyListener?.onKey(v, keyCode, event) == true)
            return@setOnKeyListener true
        if (event.action == KeyEvent.ACTION_DOWN && keysToHandle.contains(keyCode)) {
            function.invoke()
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
}

따라서 샘플 사용법 :

        editText.setOnDoneListener({
            //do something
        })

레이블 변경에 대해서는 키보드 앱에 따라 다르며 일반적으로 여기에 작성된 가로에만 변경되는 것으로 생각합니다 . 어쨌든, 이것에 대한 예제 사용법 :

        editText.imeOptions = EditorInfo.IME_ACTION_DONE
        editText.setImeActionLabel("ASD", editText.imeOptions)

또는 XML로 원하는 경우 :

    <EditText
        android:id="@+id/editText" android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:imeActionLabel="ZZZ" android:imeOptions="actionDone" />

그리고 결과 (풍경에 표시) :

여기에 이미지 설명을 입력하십시오


0

이 depencendy를 추가하면 작동합니다.

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;

0

사용자가 리턴 키를 누를 때 호출 가능한 기능을 제공합니다.

fun EditText.setLineBreakListener(onLineBreak: () -> Unit) {
    val lineBreak = "\n"
    doOnTextChanged { text, _, _, _ ->
        val currentText = text.toString()

        // Check if text contains a line break
        if (currentText.contains(lineBreak)) {

            // Uncommenting the lines below will remove the line break from the string
            // and set the cursor back to the end of the line

            // val cleanedString = currentText.replace(lineBreak, "")
            // setText(cleanedString)
            // setSelection(cleanedString.length)

            onLineBreak()
        }
    }
}

용법

editText.setLineBreakListener {
    doSomething()
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.