Android Use Done button on Keyboard to click button

AndroidKeyboard EventsAndroid Softkeyboard

Android Problem Overview


Ok in my app I have a field for the user to input a number. I have the field set to only accept numbers. When the user clicks on the field it brings up the keyboard. On the keyboard (on ICS) there is a done button. I would like for the done button on the keyboard to trigger the submit button i have in my application. My code is as follows.

package com.michaelpeerman.probability;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;

public class ProbabilityActivity extends Activity implements OnClickListener {

private Button submit;
ProgressDialog dialog;
int increment;
Thread background;
int heads = 0;
int tails = 0;

public void onCreate(Bundle paramBundle) {
	super.onCreate(paramBundle);
	setContentView(R.layout.main);
	submit = ((Button) findViewById(R.id.submit));
	submit.setOnClickListener(this);
}

public void onClick(View view) {
	increment = 1;
	dialog = new ProgressDialog(this);
	dialog.setCancelable(true);
	dialog.setMessage("Flipping Coin...");
	dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
	dialog.setProgress(0);
	EditText max = (EditText) findViewById(R.id.number);
	int maximum = Integer.parseInt(max.getText().toString());
	dialog.setMax(maximum);
	dialog.show();
	dialog.setOnCancelListener(new OnCancelListener(){

		  public void onCancel(DialogInterface dialog) {

			  background.interrupt();
			  TextView result = (TextView) findViewById(R.id.result);
				result.setText("heads : " + heads + "\ntails : " + tails);


		  }});

		
	background = new Thread(new Runnable() {
	    public void run() {
	    	heads=0;
	    	tails=0;
	        for (int j = 0; !Thread.interrupted() && j < dialog.getMax(); j++) {
	            int i = 1 + new Random().nextInt(2);
	            if (i == 1)
	                heads++;
	            if (i == 2)
	                tails++;
	            progressHandler.sendMessage(progressHandler.obtainMessage());
	        }
	    }
	});
	background.start();
}

Handler progressHandler = new Handler() {
	public void handleMessage(Message msg) {

		dialog.incrementProgressBy(increment);
		if (dialog.getProgress() == dialog.getMax()) {
			dialog.dismiss();
			TextView result = (TextView) findViewById(R.id.result);
			result.setText("heads : " + heads + "\ntails : " + tails);
			

		}
	}

};

}

Android Solutions


Solution 1 - Android

You can use this one also (sets a special listener to be called when an action is performed on the EditText), it works both for DONE and RETURN:

max.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
		public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
			if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
				Log.i(TAG,"Enter pressed");
			}	 
			return false;
		}
	});

Solution 2 - Android

You can try with IME_ACTION_DONE .

> This action performs a “done” operation for nothing to input and the > IME will be closed.

 Your_EditTextObj.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                  /* Write your logic here that will be executed when user taps next button */
                   

                    handled = true;
                }
                return handled;
            }
        });

Solution 3 - Android

Kotlin Solution

The base way to handle the done action in Kotlin is:

edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Call your code here
        true
    }
    false
}

Kotlin Extension

Use this to call edittext.onDone {/*action*/} in your main code. Keeps it more readable and maintainable

edittext.onDone { submitForm() }

fun EditText.onDone(callback: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}
Don't forget to add these options to your edittext
<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

> If you need inputType="textMultiLine" support, read this post

Solution 4 - Android

Try this:

max.setOnKeyListener(new OnKeyListener(){
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event){
        if(keyCode == event.KEYCODE_ENTER){
            //do what you want
        }
    }
});

Solution 5 - Android

Try this for Xamarin.Android (Cross Platform)

edittext.EditorAction += (object sender, TextView.EditorActionEventArgs e) {
       if (e.ActionId.Equals (global::Android.Views.InputMethods.ImeAction.Done)) {
           //TODO Something
       }
};

Solution 6 - Android

I copied the following code from AndroidStudio when you create a LoginActivity. I use the ime attributes

In your layout

<EditText android:id="@+id/unidades" android:layout_width="match_parent"
                    android:layout_height="wrap_content" android:hint="@string/prompt_unidades"
                    android:inputType="number" android:maxLines="1"
                    android:singleLine="true"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:enabled="true" android:focusable="true"
                    android:gravity="right"
                    android:imeActionId="@+id/cantidad"
                    android:imeActionLabel="@string/add"
                    android:imeOptions="actionUnspecified"/>

In your Activity

editTextUnidades.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == R.id.cantidad || actionId == EditorInfo.IME_NULL) {
                addDetalle(null);
                return true;
            }
            return false;
        }
    });

Solution 7 - Android

You can implement on key listener:

public class ProbabilityActivity extends Activity implements OnClickListener, View.OnKeyListener {

In onCreate:

max.setOnKeyListener(this);

...

@Override
public boolean onKey(View v, int keyCode, KeyEvent event){
    if(keyCode == event.KEYCODE_ENTER){
        //call your button method here
    }
    return true;
}

Solution 8 - Android

if you want to catch the keyboard enter button for doing your job which you want to done through any event like button click, you can write the below simple code for that text view

Edittext ed= (EditText) findViewById(R.id.edit_text);

ed.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Do you job here which you want to done through event
    }
    return false;
}
});

Solution 9 - Android

Kotlin and Numeric keyboard

If you are using the numeric keyboard you have to dismiss the keyboard, it will be like:

editText.setOnEditorActionListener { v, actionId, event ->
  if (action == EditorInfo.IME_ACTION_DONE || action == EditorInfo.IME_ACTION_NEXT || action == EditorInfo.IME_ACTION_UNSPECIFIED) {
      //hide the keyboard
      val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
      imm.hideSoftInputFromWindow(windowToken, 0)
      //Take action
      editValue.clearFocus()
      return true
  } else {
      return false
  }
}

Solution 10 - Android

Use this class in your layout :

public class ActionEditText extends EditText
{
    public ActionEditText(Context context)
    {
        super(context);
    }

    public ActionEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ActionEditText(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs)
    {
        InputConnection conn = super.onCreateInputConnection(outAttrs);
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        return conn;
    }

}

In xml:

<com.test.custom.ActionEditText
                android:id="@+id/postED"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:gravity="top|left"
                android:hint="@string/msg_type_message_here"
                android:imeOptions="actionSend"
                android:inputType="textMultiLine"
                android:maxLines="5"
                android:padding="5dip"
                android:scrollbarAlwaysDrawVerticalTrack="true"
                android:textColor="@color/white"
                android:textSize="20sp" />

Solution 11 - Android

max.setOnKeyListener(new OnKeyListener(){
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event){
    if(keyCode == event.KEYCODE_ENTER){
        //do what you want
    }
  }
});

Solution 12 - Android

Your Last Edittext .setOnEditorActionListener call this method automatic hit api

I was Call in LoginActivity in et_password

 et_Pass.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {

                    Log.i(TAG,"Enter pressed");
                    Log.i(Check Internet," and Connect To Server");

                }
                return false;
            }
        });

Working Fine

Solution 13 - Android

And this is a Kotlin version:

editText.setOnEditorActionListener { v, actionId, event ->
  if(actionId == EditorInfo.IME_ACTION_DONE){
      //Put your action there
      true
  } else {
      false
  }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmpeermanView Question on Stackoverflow
Solution 1 - AndroidvladexologijaView Answer on Stackoverflow
Solution 2 - AndroidIntelliJ AmiyaView Answer on Stackoverflow
Solution 3 - AndroidGiboltView Answer on Stackoverflow
Solution 4 - AndroidRoman BlackView Answer on Stackoverflow
Solution 5 - AndroidNitin V. PatilView Answer on Stackoverflow
Solution 6 - AndroidJuan RojasView Answer on Stackoverflow
Solution 7 - AndroidTinManView Answer on Stackoverflow
Solution 8 - AndroidNadeem BhatView Answer on Stackoverflow
Solution 9 - AndroidJackson Dias da SilvaView Answer on Stackoverflow
Solution 10 - AndroidYogendraView Answer on Stackoverflow
Solution 11 - AndroidRkKhanpuriyaView Answer on Stackoverflow
Solution 12 - AndroidKeshav GeraView Answer on Stackoverflow
Solution 13 - Androidiluxa.bView Answer on Stackoverflow