Hide Soft keyboard on return key press
Asked Answered
E

9

46

I've searched half a dozen other answers on SO, but haven't found one that works. All I'm trying to do is dismiss the soft keyboard when the user presses the enter button. (The equivalent of the insanely easy iOS 'resignKeyboard' call.) In the following code, the onEditorAction method does not get called. I've set up an EditText view in my XML file and the code in my fragment is as follows:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        fragView = inflater.inflate(R.layout.fragment_encrypt2, container, false);
        textField = (EditText) fragView.findViewById(R.id.textField);

        textField.setOnEditorActionListener(new TextView.OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView arg0, int actionId,
                                          KeyEvent arg2) {
                // hide the keyboard and search the web when the enter key
                // button is pressed
                if (actionId == EditorInfo.IME_ACTION_GO
                        || actionId == EditorInfo.IME_ACTION_DONE
                        || actionId == EditorInfo.IME_ACTION_NEXT
                        || actionId == EditorInfo.IME_ACTION_SEND
                        || actionId == EditorInfo.IME_ACTION_SEARCH
                        || (arg2.getAction() == KeyEvent.KEYCODE_ENTER)) {
                    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(textField.getWindowToken(), 0);

                    return true;
                }
                return false;
            }
        });

        // Inflate the layout for this fragment
        return fragView;//inflater.inflate(R.layout.fragment_encrypt2, container, false);
    }

The following is a snippet from the XML file where I define the EditText field. I need EditText to be multiline.

<EditText
            android:id="@+id/textField"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:hint="@string/Encrypted_Text_Hint"
            android:gravity="top"
            android:inputType="textMultiLine"
            android:imeOptions="actionDone"/>
Elamitic answered 30/10, 2014 at 4:43 Comment(2)
You have not set any imeOptions on EditText, in which case return is considered another input character.Petronius
I have set imeOptions, but I need EditText to be multilineElamitic
K
94

If you don't want multiple line, for you edittext you can just specify a single line. For the edittext and also you can put imeOptions as Done like this:

<EditText 
   android:id="@+id/edittext_done"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:imeOptions="actionDone"
   android:singleLine="true"
   />

I clearly don't know, whether you are trying to achieve this or not.Any way take a look.

EDIT: android:singleLine is deprecated since API 3 due to bad performance, you have to use android:maxLines instead. singleLine will be available because even now some effects are not supported by android:maxLines attribute.

Krisha answered 30/10, 2014 at 4:56 Comment(3)
Remove last attribute 'singleLine', then run itSyzran
I set it to multilineElamitic
Multiline and android:imeOptions="actionDone" seems that cannot work at the sime timeBridgid
A
10

Below code works for me.

IN XML:

    android:imeOptions="actionDone"
    android:inputType="textCapWords"

IN JAVA CLASS:

    edit_text.setOnEditorActionListener(new OnEditorActionListener() {

                @Override
                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                    // TODO Auto-generated method stub

                    if ((actionId==EditorInfo.IME_ACTION_DONE )   )
                     {   
                        //Toast.makeText(getActivity(), "call",45).show();
                       // hide virtual keyboard
                       InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);

                       //or try following:
                       //InputMethodManager imm = (InputMethodManager)getBaseContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                       imm.hideSoftInputFromWindow(auto_data.getWindowToken(), 0);
                       return true;
                    }
                    return false;

                }
            });
Abstraction answered 3/11, 2015 at 7:12 Comment(0)
E
9

I solved the issue by changing the following in the XML file from:

 android:inputType="textMultiLine"

to:

 android:inputType="textImeMultiLine"
Elamitic answered 3/11, 2014 at 3:31 Comment(1)
Close! This moves the focus to the next item in the layout, but doesn't close the soft keyboard.Dilator
U
5

Based on my tests, what is really required to dismiss the soft keyboard, when a user clicks the enter button, can be achieved simply by adding the code below to your EditText in xml.

android:imeOptions="actionDone"
android:inputType="textImeMultiLine"

No need for OnEditorActionListener or any other Java code.

Unload answered 31/1, 2018 at 13:38 Comment(0)
P
3

Accepted answer is deprecated:

<EditText 
   android:id="@+id/edittext_done"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:imeOptions="actionDone"
   android:singleLine="true"
/>

Try with this:

<EditText 
   android:id="@+id/edittext_done"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:imeOptions="actionDone"
   android:maxLines="1"
/>
Ppi answered 3/2, 2017 at 20:4 Comment(0)
B
2

EditText.xml

<EditText
        android:id="@+id/edit_text_searh_home"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="4dp"
        android:singleLine="true"
        android:lines="1"
        android:hint="Ingresa palabras claves"
        android:imeActionLabel="Search"
        android:background="@drawable/rounded_edit_text_search"
        android:drawableRight="@android:drawable/ic_menu_search"/>

Fragment.java

final EditText edit_text_searh = (EditText) v.findViewById(R.id.edit_text_searh_home);

    edit_text_searh.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(edit_text_searh.getWindowToken(), 0);

            Toast.makeText(getContext(),edit_text_searh.getText(),Toast.LENGTH_SHORT).show();
            return true;

        }
    });
Brevier answered 3/5, 2016 at 19:39 Comment(0)
S
0

This may be you could add a attribute to your EditText like this:

android:imeOptions="actionSearch"
Syzran answered 30/10, 2014 at 4:47 Comment(1)
even with this option, the actionListener still wasn't calledElamitic
A
0

Try this method, It may be solve your problem.

protected void showKeyboard() {

            InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
            if (activity.getCurrentFocus() == null) {
                inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
            } else {
                View view = activity.getCurrentFocus();
                inputMethodManager.showSoftInput(view,InputMethodManager.SHOW_FORCED);
            }
        }

        /**
         * Hide keyboard.
         */
        protected void hideKeyboard() {

            InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
            View view = activity.getCurrentFocus();
            if (view == null) {
                if (inputMethodManager.isAcceptingText())
                    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
            } else {
                if (view instanceof EditText)
                    ((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
                inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            }          
        }
Airfield answered 30/10, 2014 at 6:17 Comment(1)
The issue is the actionListener is not called, so I couldn't even call these methodsElamitic
A
0

This is what worked for me. Based on this layout xml:

<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/ip_override_text_input_sat"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:hint="IP Address" />
</com.google.android.material.textfield.TextInputLayout>

I needed to do this for the keyboard to dismiss and the text into to lose focus and hide the cursor.

findViewById<TextView>(R.id.ip_override_text_input_sat).setOnKeyListener { v, keyCode, event ->
            if (keyCode == KeyEvent.KEYCODE_ENTER && currentFocus != null) {
                val inputManager =
                    getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                inputManager.hideSoftInputFromWindow(
                    this.currentFocus!!.windowToken,
                    HIDE_NOT_ALWAYS
                )
                currentFocus!!.clearFocus()
                return@setOnKeyListener true
            }
            return@setOnKeyListener false
        }

Hope this helps someone doing the same

Alathia answered 9/4, 2020 at 18:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.