Niejawne „Prześlij” po naciśnięciu Gotowe na klawiaturze w ostatnim EditText

98

Korzystałem z niektórych aplikacji, w których po wpisaniu nazwy użytkownika, a następnie przejściu do mojego hasła, naciśnięciu przycisku „Gotowe” na klawiaturze, formularz logowania jest przesyłany automatycznie, bez konieczności klikania przycisku przesyłania. Jak to się robi?

JK
źródło
Wypróbuj ten link, odpowiedz ... wstaw dane do bazy danych po kliknięciu przycisku
Gotowe
Szybki link do dokumentacji: Określ działanie metody wprowadzania danych
pierwsza 1

Odpowiedzi:

187

Spróbuj tego:

W swoim układzie umieść / edytuj to:

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

W swojej aktywności umieść to (np. W 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;
     }
 });

Gdzie submit_btnjest twój przycisk przesyłania z dołączonym programem obsługi onclick.

Hariharan
źródło
15
submit_btn.performClick();pali mi oczy. Srsly? Dlaczego nie wywołać metody przesyłania?
Laurent Meyer
28
@LaurentMeyer Symulowanie danych wejściowych użytkownika jest zwykle lepsze niż bezpośrednie wywoływanie podstawowej logiki w takich sytuacjach. Na przykład przycisk przesyłania może być obecnie wyłączony, więc performClick () nie zrobiłby nic (zgodnie z zamierzeniami), ale jeśli wywołałeś metodę przesyłania bezpośrednio, musisz najpierw sprawdzić, czy przycisk nie został wyłączony.
Odtworzy
3
@LaurentMeyer Co masz na myśli mówiąc o wrażliwości na interfejs użytkownika? I oczywiście 5 osób w ciągu ostatnich 6 miesięcy. Daj im czas, a ludzie prawdopodobnie też się ze mną zgodzą. ;)
Extragorey
Rozważmy, że zmienisz interfejs użytkownika, używając przycisku do czegoś innego. Kod będzie prawdziwym bałaganem, a co gorsza, musisz mieć naprawdę rozbudowane procedury testowe, aby wykryć tego rodzaju błąd. Jeszcze gorzej jest, gdy udostępniasz komponent UI z takimi praktykami.
Laurent Meyer
2
TWIMC, używanie imeActionLabelw moim EditText wyłączało całe to zachowanie. Uważaj
Alwin Kesler
25

Musisz ustawić opcje IME na swoim 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" />

Następnie dodaj OnEditorActionListenerdo widoku, aby nasłuchiwać wykonanej czynności.

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

Oficjalny dokument API: https://developer.android.com/guide/topics/ui/controls/text.html#ActionEvent

flx
źródło
22

Proste i skuteczne rozwiązanie z Kotlinem

Przedłużenie EditText:

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

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

       true

    }
}

Następnie użyj nowej metody w następujący sposób:

editText.onSubmit { submit() }

Gdzie submit()jest coś takiego:

fun submit() {
    // call to api
}

Bardziej ogólne rozszerzenie

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

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

        true
    }
}

A potem możesz go użyć do odsłuchania swojego wydarzenia:

email.on(EditorInfo.IME_ACTION_NEXT, { confirm() })
Francesco Donzello
źródło
6

Tak to się robi

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

Nie zapomnij dodać

<EditText android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:imeOptions="actionDone"/>

actionDone w twoim EditText .

Jitender Dev
źródło
2

W pliku XML wewnątrz tagu edittext dodaj poniższy fragment

android:imeOptions="actionDone"

Następnie w klasie Java napisz poniższy kod

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; 
   } 
  });
Madhu Kumar
źródło
1

dodaj następujący wiersz w edittext

android:imeOptions="actionDone"

Miłego kodowania

Senthil JS
źródło
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
Rabia Aydoğdu
źródło
To dokładnie ta sama odpowiedź, co ta . Powinieneś trochę wyjaśnić, jak myślisz, że to rozwiązuje problem OP.
Adrian W
1

Po prostu rozszerz tę odpowiedź

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)
}
bitvale
źródło
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" />

w pliku .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;
        }
    });
Amit Gupta
źródło
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;
     }
 });
Divyesh Kevadiya
źródło