10

I have an EditText in an Activity and I want it to be active and soft-keyboard be open when I open that Activity. Here is my xml for EditText:

<EditText
    android:background="@null"
    android:cursorVisible="true"
    android:elegantTextHeight="true"
    android:enabled="true"
    android:focusable="true"
    android:hint="Search"
    android:id="@+id/editText11"
    android:inputType="textNoSuggestions|textCapSentences"
    android:layout_centerVertical="true"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:singleLine="true"
    android:textColor="#000000"
    android:textCursorDrawable="@null" />

and I have used android:windowSoftInputMode="stateVisible" for the activity in which I have this EditText.

The problem is, when I press back once, the keyboard does not hide(ideally it does in all other EditTexts) and when I press back again, it closes the Activity. On the first back press, I am not getting a call to onBackPressed() while on the second back press, I do. Why is this kind of behaviour is happening and how to resolve it?

Edit What I want is, if keyboard is open, pressing back should close the keyboard and if the keyboard is not open, then close the activity.

Dhruv
  • 1,801
  • 1
  • 15
  • 27
Amit Tiwari
  • 3,684
  • 6
  • 33
  • 75

4 Answers4

14

Try this ...

create class called Util and put this code

public static void hideSoftKeyboard(Activity activity) {
    final InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    if (inputMethodManager.isActive()) {
        if (activity.getCurrentFocus() != null) {
            inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
        }
    }
}

and call on the onBackPressed() of Activity

Nrup Parikh
  • 386
  • 1
  • 6
5

I add below code in my BaseActivity.java

@Override
protected void onPause() {
    super.onPause();

    final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null && inputMethodManager.isActive()) {
        if (getCurrentFocus() != null) {
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
    }
}
Better
  • 165
  • 1
  • 13
1

Try like this,

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                 //useful for hiding the soft-keyboard is:
                 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

                return true;
        }

    }
    return super.onKeyDown(keyCode, event);
}

This may helps you

Sathish Kumar J
  • 4,280
  • 1
  • 20
  • 48
0

As Your Requirement :

if keyboard is open, pressing back should close the keyboard and if the keyboard is not open, then close the activity

I Have tested my code is work fine.

Step 1 : Create CustomEditText like below.

 <com.yourpackage.yourappname.CustomEditText
        android:id="@+id/edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

Step 2 : Create CustomEditText.java class.

public class CustomEditText extends EditText {

    Context context;
    private static Activity mSearchActivity;;

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
        if(mSearchActivity != null && event.getKeyCode() == KeyEvent.KEYCODE_BACK){
            KeyEvent.DispatcherState state = getKeyDispatcherState();

            if(state != null){
                if(event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0){

                    InputMethodManager mgr = (InputMethodManager)
                            context.getSystemService(Context.INPUT_METHOD_SERVICE);
                    mgr.hideSoftInputFromWindow(this.getWindowToken(), 0);
                }
                else if(event.getAction() == KeyEvent.ACTION_UP && !event.isCanceled() && state.isTracking(event)){
                    mSearchActivity.onBackPressed();
                    return true;
                }
            }
        }


        return super.dispatchKeyEventPreIme(event);
    }    

}

Step 3 : In Your Activity intialize the CustomEditText and hide KeyBoard like below.

CustomEditText editText = (CustomEditText) findViewById(R.id.edittext);

        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

Step 4: In Your Activity simply Override the onBackPressed() method.

 @Override
    public void onBackPressed() {
        super.onBackPressed();

    }