Неявное «Отправить» после нажатия Done на клавиатуре в последнем EditText

98

Я использовал некоторые приложения, в которых, когда я заполняю свое имя пользователя, затем перехожу к своему паролю, если я нажимаю «Готово» на клавиатуре, форма входа в систему отправляется автоматически, мне не нужно нажимать кнопку отправки. Как это сделать?

JK
источник
Попробуйте ответить по этой ссылке ... вставьте данные в базу данных при нажатии кнопки «
Готово» на
Быстрая ссылка на документы: Укажите действие метода ввода
FirstOne

Ответы:

188

Попробуй это:

В вашем макете поместите / отредактируйте это:

<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_btnнаходится ваша кнопка отправки с прикрепленным обработчиком onclick.

Харихаран
источник
15
submit_btn.performClick();горит мне в глазах. Srsly? Почему бы не вызвать метод отправки?
Лоран Мейер,
28
@LaurentMeyer В таких ситуациях имитация пользовательского ввода обычно лучше, чем прямой вызов базовой логики. Например, кнопка отправки может быть отключена в настоящее время, поэтому performClick () ничего не сделает (как и предполагалось), но если вы вызвали метод отправки напрямую, вам нужно будет сначала проверить, не отключена ли кнопка. Он также будет воспроизводить звук щелчка, как если бы кнопка была нажата, и т. Д.
Extragorey
3
@LaurentMeyer Что вы имеете в виду под пользовательским интерфейсом? И 5 человек за последние 6 месяцев, конечно. Дайте им время, и люди, вероятно, тоже согласятся со мной. ;)
Extragorey 03
Предположим, вы меняете пользовательский интерфейс, который использует кнопку для чего-то другого. Код будет настоящим беспорядком, и, что еще хуже, вам понадобятся действительно обширные процедуры тестирования для обнаружения такого рода ошибок. Еще хуже, когда вы делитесь компонентом пользовательского интерфейса с такими практиками.
Лоран Мейер
2
TWIMC, использование imeActionLabelв моем EditText отключало все это поведение. Осторожно
Алвин Кеслер
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

flx
источник
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"/>

actionDone в вашем EditText.

Джитендер Дев
источник
2

В вашем XML-файле внутри вашего тега edittext добавьте ниже фрагмент

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"

Удачного кодирования

Senthil JS
источник
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)
}
Bitvale
источник
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;
     }
 });
Дивеш Кевадия
источник