Android - Obsługa „Enter” w EditText

459

Zastanawiam się, czy istnieje sposób, aby poradzić sobie z naciśnięciem klawisza Enterpodczas wpisywania EditTextczegoś podobnego do zdarzenia HTML onSubmit.

Zastanawia mnie również, czy istnieje sposób na manipulowanie wirtualną klawiaturą w taki sposób, że przycisk „Gotowe” jest oznaczony czymś innym (na przykład „Idź”) i wykonuje określoną akcję po kliknięciu (ponownie, jak onSubmit).

Felix
źródło
1
Kotlin i Rozszerzenia: spójrz tutaj: stackoverflow.com/a/48810268/1912924
Francesco Donzello

Odpowiedzi:

374

Zastanawiam się, czy istnieje sposób, aby obsłużyć naciśnięcie użytkownika Enterpodczas pisania w EditText, coś takiego jak zdarzenie HTML onSubmit.

Tak.

Zastanawia mnie również, czy istnieje sposób na manipulowanie wirtualną klawiaturą w taki sposób, że przycisk „Gotowe” jest oznaczony czymś innym (na przykład „Idź”) i wykonuje określoną akcję po kliknięciu (ponownie, jak onSubmit).

Też tak.

Będziesz chciał przyjrzeć się atrybutom android:imeActionIdi android:imeOptions, a także setOnEditorActionListener()metodzie TextView.

Aby zmienić tekst przycisku „Gotowe” na niestandardowy ciąg, użyj:

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);
CommonsWare
źródło
26
(PS EditText rozszerza TextView, dlatego właściwości, na które powinieneś spojrzeć, znajdują się w TextView - kiedy po raz pierwszy przeczytałem ostatnie zdanie, zrobiłem to podwójnie :))
Ricket
15
Jako uwaga Nie wszystkie klawiatury obsługują standardowy atrybut android: imeOptions. Co jest naprawdę rozczarowujące. Na przykład IME_ACTION_DONE jest zdefiniowany jako 6, gdzie domyślna klawiatura HTC (w telefonach takich jak Incredible, Evo 4G) klawisz powrotu jest zdefiniowana jako 0.
fernferret
13
Również jeśli używasz imeOptions, upewnij się, że używasz również inputType = "text" lub innego odpowiednika. Aby klawiatura nas słuchała! Nexus1
Blundell,
6
„Tak” - czy byłbyś bardziej opisowy niż to? Prawdopodobnie zapyta, jak wdrożyć rozwiązanie.
Al Wang
4
@AlWang: Po pierwsze, twój problem dotyczy odpowiedzi (patrz zaczynając od „Będziesz chciał ...”). Po drugie, odpowiedź brzmi sześć lat temu i można by przypuszczać, że problem PO został rozwiązany. W końcu PO zaakceptował odpowiedź.
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;
    }
});
Prawo Jarod DY
źródło
1
Z jakiegoś powodu po kliknięciu entertekstu edycji cały tekst edycji przesuwa się w dół ... Jak mogę to naprawić?
Ruchir Baronia
1
@RuchirBaronia Dodaj Androida: maxLines = "1" do tekstu edycji. Twój tekst EditText nie „przesuwa się w dół”, ale raczej wstawia podział wiersza do wprowadzonego tekstu. Ustawienie maxLines na 1 zapobiega wstawianiu podziału linii.
lustig
3
To rozwiązanie działa tylko w przypadku klawiatur sprzętowych, NIE zaś w przypadku klawiatury miękkiej / wirtualnej. Jeśli na tym polegasz, aplikacja zostanie zepsuta dla użytkowników bez podłączonych klawiatur.
user3562927 18.04.17
12
Bez obrazy dla CommonsWare, ale jego odpowiedź RTFM była o wiele mniej przydatna niż ten prosty przykład pokazujący dokładnie, jak to zrobić. Dziękuję Ci!
AutonomousApps
1
@AutonomousApps, często widzę odpowiedzi CommonsWare. Miał szczęście odpowiedzieć od 2009 roku, kiedy zaczął się system Android. Często „tak”, „nie”, „niemożliwe” i tak dalej, zwykle bez kodu. Często jego odpowiedzi są już nieaktualne, więc staram się nie stosować się do jego zaleceń.
CoolMind
215

Oto co robisz. Jest również ukryty w przykładowym kodzie programisty Androida „Czat Bluetooth”. Wymień pogrubione części z napisem „przykład” własnymi zmiennymi i metodami.

Najpierw zaimportuj to, czego potrzebujesz, do głównego działania, w którym chcesz, aby przycisk powrotu zrobił coś specjalnego:

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

Teraz utwórz zmienną typu TextView.OnEditorActionListener dla swojego klucza powrotu (tutaj używam exampleListener );

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

Następnie musisz powiedzieć słuchaczowi dwie rzeczy o tym, co zrobić po naciśnięciu przycisku powrotu. Musi wiedzieć, o czym jest EditText (tutaj używam exampleView ), a następnie musi wiedzieć, co zrobić, gdy zostanie naciśnięty klawisz Enter (tutaj, example_confirm () ). Jeśli jest to ostatni lub jedyny tekst EditText w Twojej aktywności, powinien on zrobić to samo, co metoda onClick dla przycisku Prześlij (lub OK, Potwierdź, Wyślij, Zapisz itp.).

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;
}

Na koniec ustaw detektor (najprawdopodobniej w metodzie onCreate);

exampleView.setOnEditorActionListener(exampleListener);
Chad Hedgcock
źródło
20
Fajnie, użyłem EditorInfo.IME_ACTION_SEND i mam Androida: imeOptions = "actionSend" na XML.
Bani
szukanie EditorInfo.IME_ACTION_SEND nie miało dla mnie żadnego efektu (emulator), więc jako niezawodny wyzwalacz szukałem również KeyEvent.KEYCODE_ENTER. Zobacz tutaj: stackoverflow.com/questions/2004344/…
Ktoś gdzieś
4
Zwykle lepiej jest wykonywać akcje KeyEvent.ACTION_UP. Aby to zadziałało, trzeba najpierw zużywają ACTION_DOWNwydarzenie: if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }. Następnie możesz sprawdzić ACTION_UPzdarzenie i wykonać akcję (podobną do powyższej odpowiedzi). Jeśli nie wykorzystasz ACTION_DOWNzdarzenia, onEditorActionnie zostaniesz wezwany ACTION_UP.
Ashughes
2
Oto, co zadziałało dla mnie: if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}- nie mogłem znaleźć żadnego z innych podejść do pracy
Jonathan Ellis
38

Klawiatury sprzętowe zawsze dają zdarzenia enter, ale klawiatury programowe zwracają różne ID akcji i wartości zerowe w tekstach edycji SingleLine. Ten kod reaguje za każdym razem, gdy użytkownik naciśnie klawisz Enter w tekście EditText, dla którego ustawiony został ten detektor, niezależnie od tego, czy jest on edytowany, czy typ klawiatury.

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
  }
};

Domyślny wygląd klawisza Enter w singleLine = false daje wygiętą strzałkę na klawiaturze. Kiedy singleLine = true w ostatnim EditText, klucz mówi GOTOWE, a na EditTexts przed nim NEXT. Domyślnie takie zachowanie jest spójne we wszystkich emulatorach waniliowych, androidowych i google. Atrybut scrollHorizontal nie robi żadnej różnicy. Test zerowy jest ważny, ponieważ odpowiedź telefonów na miękkie wejścia jest pozostawiona producentowi, a nawet w emulatorach, emulatory waniliowe poziomu 16 reagują na długie miękkie wejścia w wieloliniowych i przewijanych poziomych tekstach edycyjnych z działaniem Id NEXT i zerowe dla wydarzenie.

Earcasper
źródło
Kiedy zaktualizowałem Javę, mój łańcuch narzędzi Androida zepsuł się. To był 32-bit. Ponownie zainstalowałem wszystko w wersji 64-bitowej i odkryłem, że dostępnych jest teraz wiele innych publicznych wersji emulatorów. Muszę przyznać, że wiem tylko, że zachowanie EditorActionListener jest spójne w testowanych emulatorach.
Earcasper
Kiedy opublikowałem to na moim blogu, ktoś skomentował, że aby działało w przypadku zaćmienia, musisz zmienić domyślną akcję ime, dodając Androida: imeOptions = ”actionGo”.
Earcasper
Ups, źle odczytałem komentarz do mojego posta na blogu. Aby działało w środowisku Eclipse, musisz zmienić domyślną akcję ime, dodając Androida: imeOptions = ”actionGo”. do „EditText” w xml układu.
Earcasper
Po dalszej refleksji mój ostatni komentarz odnosi się zarówno do Mrówki, jak i Zaćmienia
Earcasper
27

Ta strona opisuje dokładnie, jak to zrobić.

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

Ustaw Androida: imeOptions, a następnie po prostu sprawdź actionId w onEditorAction. Więc jeśli ustawisz imeOptions na „actionDone”, wtedy sprawdziłbyś „actionId == EditorInfo.IME_ACTION_DONE” w onEditorAction. Upewnij się również, czy ustawiłeś android: inputType.

Oto EditText z powyższego przykładu:

<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" />

Możesz to również ustawić programowo za pomocą funkcji setImeOptions (int) . Oto OnEditorActionListener z powyższego przykładu:

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;
    }
});
Mikrofon
źródło
21

Wiem, że to roczek, ale właśnie odkryłem, że działa idealnie dla EditText.

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

Zapobiega tylko tekstowi i spacji. Nie mogłem tabulować, „return” („\ n”) ani nic takiego.

Nowicjusz
źródło
Pracowałem dla mnie, z dodaniem IME_ACTION_DONE
htafoya
1
Działa idealnie dobrze, jeśli chcesz wyłączyć klawisz „Enter”.
deeJ
16

Podobnie jak dodatek do odpowiedzi Chada (który działał prawie idealnie dla mnie), stwierdziłem, że muszę dodać kontrolę typu akcji KeyEvent, aby zapobiec dwukrotnemu wykonywaniu kodu (raz na klawiaturze i raz na klawiaturze) zdarzenie).

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

Widzieć http://developer.android.com/reference/android/view/KeyEvent.html, aby uzyskać informacje na temat powtarzania zdarzeń akcji (przytrzymanie klawisza Enter) itp.

kermitologia
źródło
16

Miałem podobny cel. Chciałem rozwiązać, naciskając klawisz „Enter” na klawiaturze (który chciałem dostosować) w AutoCompleteTextView, który rozszerza TextView. Próbowałem różnych rozwiązań z góry i wydawało się, że działają. ALE napotkałem pewne problemy, kiedy zmieniłem typ wejścia na moim urządzeniu (Nexus 4 z AOKP ROM) z SwiftKey 3 (gdzie działało idealnie) na standardową klawiaturę Android (gdzie zamiast obsługiwać mój kod od słuchacza, nowa linia była wszedł po naciśnięciu klawisza „Enter”. Zajęło mi trochę czasu, aby poradzić sobie z tym problemem, ale nie wiem, czy zadziała we wszystkich okolicznościach, bez względu na to, jakiego typu wejścia użyjesz.

Oto moje rozwiązanie:

Ustaw atrybut typu wejściowego TextView w pliku XML na „tekst”:

android:inputType="text"

Dostosuj etykietę klawisza „Enter” na klawiaturze:

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

Ustaw OnEditorActionListener na 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;
    }
});

Mam nadzieję, że pomoże to innym uniknąć problemów, które miałem, ponieważ prawie doprowadziły mnie do szału.

kaolick
źródło
Niestety nie działa to z nową wersją 4 SwiftKey. I znów doprowadza mnie to do szału ...: - /
kaolick
3
twój IF jest niepoprawny. użyj: 'event.getKeyCode () == KeyEvent.KEYCODE_ENTER'
Loda
Idealne dla mnie. Pamiętaj także, aby ponownie wstawić setImeActionLabel do instrukcji IF, w przeciwnym razie tekst niestandardowy zniknie po pierwszym naciśnięciu.
Steve Rogers
Jego JEŻELI jest poprawne, ponieważ ustawia wartość actionId na KeyEvent.KEYCODE_ENTER powyżej :-D, ale tak, wszyscy inni prawdopodobnie będą chcieli użyć event.getKeyCode () == KeyEvent.KEYCODE_ENTER
Ray Hulha
15

W swoim pliku xml dodaj atrybut imeOptions do editText

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

Następnie w kodzie Java dodaj OnEditorActionListener do tego samego 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;
        }
    });

Oto wyjaśnienie - ImeOptions = actionDone przypisze „actionDone” do EnterKey. Klawisz Enter na klawiaturze zmieni się z „Enter” na „Gotowe”. Tak więc, kiedy zostanie naciśnięty klawisz Enter, uruchomi to działanie i tym samym sobie z nim poradzisz.

ARKA
źródło
9

Możesz to również zrobić ..

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;
        }
    });
Jawad Zeb
źródło
Z jakiegoś powodu po kliknięciu entertekstu edycji cały tekst edycji przesuwa się w dół ... Jak mogę to naprawić?
Ruchir Baronia
Myślę, że chcesz się nauczyć stackoverflow.com/questions/10978038/... w przeciwnym razie pokaż mi swój plik xml
Jawad Zeb
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;
        }
    });

Działa dla mnie bardzo dobrze
Ponadto ukryj klawiaturę

Vlad
źródło
5

Najpierw musisz ustawić opcję EditText nasłuchiwać naciśnięcia klawisza

@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);

}

Po drugie, zdefiniuj zdarzenie po naciśnięciu klawisza, na przykład zdarzenie, aby ustawić tekst 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;   

}

I na koniec, nie zapomnij zaimportować EditText, TextView, OnKeyListener, KeyEvent u góry:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;
LifeiSHot
źródło
5

działa idealnie

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");

        }
    });
}

}

działa idealnie

Domi mtz
źródło
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" />
kreker
źródło
4

To powinno działać

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!");
                    }
           }
          });
ORY
źródło
4

Wpisz ten kod w edytorze, aby mógł zaimportować niezbędne moduły.

 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;
        }
    });
Sanjit Prasad
źródło
query = Nazwa pola EditText, a także dodaj to -> (android: imeOptions = "actionSearch") w pliku XML EditText.
Sanjit Prasad
3

Działa to dobrze na telefonach z Androidem LG. Zapobiega ENTERinterpretowaniu innych znaków specjalnych jako znaków normalnych. Nextlub Doneprzycisk pojawia się automatycznie i ENTERdziała zgodnie z oczekiwaniami.

edit.setInputType(InputType.TYPE_CLASS_TEXT);
Milan Švec
źródło
To JEDYNA rzecz, która działała dla mnie. Mam Motorola Moto X 2 i zwykle ma klawisz „Return” ze strzałką i wszystkim. To zmieniło znak na znacznik wyboru i mogłem w końcu zachęcić słuchacza do pracy z tym. (Przed utworzeniem nowej linii). Więc jeśli ktoś ma ten problem ...
Cola mistyczna
2

Oto prosta funkcja statyczna, którą możesz wrzucić do swojej Utilslub Keyboardsklasy, która wykona kod, gdy użytkownik naciśnie klawisz powrotu na klawiaturze sprzętowej lub programowej. To zmodyfikowana wersja doskonałej odpowiedzi @ Earcasper

 /**
 * 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;
        }
    };
}
JohnnyLambada
źródło
Zauważ, że używa to wyrażenia lambda, które wymaga Java 1.8, ale łatwo jest przekonwertować je tak, aby nie używało lambda. Jednak problem, który widziałem przy tego typu rozwiązaniach, polega na tym, że wirtualna klawiatura nie ukrywa się automatycznie, a jeśli w trybie pełnoekranowym (małe urządzenie w orientacji poziomej) tryb pełnoekranowy nie wyłącza się po naciśnięciu przez użytkownika klawisza Enter lub
GOTOWE
2

InputType w polu tekstowym musi być text, aby zadziałało to, co powiedział Commons Commons. Po prostu wypróbowałem to wszystko, bez inputType przed próbą i nic nie działało, Enter nadal rejestrował się jako soft enter. Potem inputType = textwszystko, łącznie z setImeLabel, działało.

Przykład: android:inputType="text"

Odaym
źródło
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;
        }
    });
Brinda Rathod
źródło
1

Niezawodnym sposobem odpowiedzi na <enter> w EditText jest TextWatcher , LocalBroadcastManager i BroadcastReceiver . Musisz dodać bibliotekę wsparcia v4, aby korzystać z LocalBroadcastManager. Korzystam z samouczka na stronie vogella.com : 7.3 „Lokalne transmisje z LocalBroadcastManager” z powodu pełnego zwięzłego kodu Przykład. W onTextChanged before jest indeks końca zmiany przed zmianą >; minus start. Gdy w TextWatcher wątek interfejsu użytkownika jest zajęty aktualizowaniem edytowalnego editText, więc wysyłamy zamiar wznowienia BroadcastReceiver, gdy wątek interfejsu użytkownika zakończy aktualizację editText.

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
Earcasper
źródło
Jeśli używasz dowolnego z typów wprowadzania tekstu * (np. android:inputType="textCapSentences"), Znaki powrotu karetki są odfiltrowywane z wejścia, więc funkcja onTextChanged () nie jest wywoływana, gdy użytkownik naciśnie klawisz Enter.
jk7
1

Na to pytanie nie ma jeszcze odpowiedzi w przypadku Butterknife

LAYOUT 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 JAVA

@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;
}
Ktoś gdzieś
źródło
TextInputLayout and Butterknife: WIN!
Javi,
1

Korzystając z Kotlin, stworzyłem funkcję, która obsługuje wszystkie rodzaje „wykonanych” działań dla EditText, w tym klawiaturę, i można go modyfikować, a także obsługiwać inne klawisze, jak chcesz:

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
    }
}

Przykładowe użycie:

        editText.setOnDoneListener({
            //do something
        })

Jeśli chodzi o zmianę etykiety, myślę, że zależy to od aplikacji na klawiaturze i zwykle zmienia się tylko w układzie poziomym, jak tutaj napisano . W każdym razie przykładowe użycie tego:

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

Lub, jeśli chcesz w XML:

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

A wynik (pokazany w układzie poziomym):

wprowadź opis zdjęcia tutaj

programista Androida
źródło
0

Dodaj te depencendy i powinno działać:

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
Jacky Supit
źródło
0

Umożliwi to wywołanie funkcji, gdy użytkownik naciśnie klawisz powrotu.

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()
        }
    }
}

Stosowanie

editText.setLineBreakListener {
    doSomething()
}
Michał
źródło