在最后一个 EditText 键盘上点击“完成”后隐式“提交”

我曾经使用过一些应用程序,当我填写我的用户名,然后进入我的密码,如果我在键盘上点击“完成”,登录表单会自动提交,而不需要我点击提交按钮。这是怎么做到的?

67762 次浏览

Try this:

In your layout put/edit this:

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

In your activity put this (e. g. in 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;
}
});

Where submit_btn is your submit button with your onclick handler attached.

You need to set the IME Options on your 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" />

Then add a OnEditorActionListener to the view to listen for the "done" action.

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

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

This is how it is done

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

Don't forget to add following

<EditText android:layout_height="wrap_content"


android:layout_width="wrap_content"


android:imeOptions="actionDone"/>

actionDone in your EditText.

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

in the java file

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

Simple and effective solution with Kotlin

Extend EditText:

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


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


true


}
}

Then use the new method like this:

editText.onSubmit { submit() }

Where submit() is something like this:

fun submit() {
// call to api
}

More generic extension

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


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


true
}
}

And then you can use it to listen to your event:

email.on(EditorInfo.IME_ACTION_NEXT, { confirm() })

In your XML file inside your edittext tag add below snippet

android:imeOptions="actionDone"

Then inside your Java class, write the below code

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

add the following line in edittext

android:imeOptions="actionDone"

Happy coding

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

Just extend this answer

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