Android-EditText에서 "Enter"처리


459

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

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


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

답변:


374

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

예.

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

또한 그렇습니다.

android:imeActionIdandroid: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 , LocalBroadcastManagerBroadcastReceiver를 사용하는 것 입니다. 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.