Как показать мягкую клавиатуру, когда edittext сфокусирован

Я хочу автоматически показывать мягкую клавиатуру, когда фокусировка EditText (если устройство не имеет физической клавиатуры), и у меня есть две проблемы:

  • Когда отображается мой Activity, мой EditText сфокусирован, но клавиатура не отображается, мне нужно снова нажать на нее, чтобы отобразить клавиатуру (она должна отображаться, когда отображается мой Activity).

  • И когда я нажимаю на клавиатуре, клавиатура диссипируется, но EditText остается сфокусированным, а y не хочет (потому что мое редактирование сделано).

Чтобы возобновить работу, моя проблема состоит в том, чтобы иметь что-то большее на iPhone: которые синхронизируют клавиатуру с моим состоянием EditText (сфокусированным/не сфокусированным) и, конечно же, не представляют собой мягкую клавиатуру, если есть физическое один.

Ответ 1

Чтобы заставить программную клавиатуру появляться, вы можете использовать

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

А для удаления фокуса на EditText, к сожалению, вам нужен манекен View, чтобы захватить фокус.

Надеюсь, это поможет


Чтобы закрыть его, вы можете использовать

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);

Это работает для использования в диалоге

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}

Ответ 2

У меня была та же проблема. Сразу после изменения editText VISIBILITY от GONE до VISIBLE мне пришлось установить фокус и отобразить мягкую клавиатуру. Я достиг этого, используя следующий код:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

Он работает для меня с задержкой в ​​100 мс, но без какой-либо задержки или с задержкой 1 мс.

Комментируемая часть кода показывает другой подход, который работает только на некоторых устройствах. Я тестировал на OS версии 2.2 (эмулятор), 2.2.1 (реальное устройство) и 1.6 (эмулятор).

Этот подход спас меня от боли.

Ответ 3

Чтобы вызвать отображение клавиатуры, используйте

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

Этот метод более надежный, чем непосредственный вызов InputMethodManager.

Чтобы закрыть его, используйте

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

Ответ 4

Если ничего не работает, заставьте его показать:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

Ответ 5

Следующий код разграблен исходным кодом Google 4.1 для SearchView. Кажется, работает, отлично и в меньших версиях Android.

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

Затем дополнительно добавляется следующий код, который создается при создании Control/Activity. (В моем случае это составной элемент управления, а не активность).

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});

Ответ 6

android:windowSoftInputMode="stateAlwaysVisible" → в файле манифеста.

edittext.requestFocus(); → в коде.

Это откроет мягкую клавиатуру, на которой в текстовом редакторе будет запрашиваться фокус при появлении активности.

Ответ 7

У меня была недавняя удача в некоторых простых случаях с кодом ниже. Я еще не закончил тестирование, но...

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

И до появления клавиатуры появляется.

Ответ 8

Вы можете попытаться заставить мягкую клавиатуру появиться, она работает для меня:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

Ответ 9

Иногда raukodraug ответ не будет работать. Я делаю это таким образом с некоторыми испытаниями и ошибками:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

И часть EditText:

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });

Ответ 10

Чтобы скрыть клавиатуру, используйте следующую команду:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

и показать клавиатуру:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Ответ 11

showSoftInput вообще не работал у меня.

Я понял, что мне нужно установить режим ввода: (здесь в компоненте Activity в манифесте)

android:windowSoftInputMode="stateVisible" 

Ответ 12

Для фрагмента убедитесь, что он работает:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

Ответ 13

Верьте, что моя проблема с Soft Keyboard была решена, когда я обнаружил, что анимация Activities может отключить Soft Keyboard. Когда вы вызываете намерение с помощью

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

и

overridePendingTransition(0, 0);

Он может скрывать Soft Keyboard, и нет способа показать его.

Ответ 14

У меня была одна и та же проблема в разных ситуациях, и решения, которые я нашел, работают в некоторых, но не работают в других, поэтому вот комбайтное решение, которое работает в большинстве ситуаций, которые я нашел:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}

Ответ 15

Я объединил все здесь, и для меня это работает:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Ответ 16

editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});

Ответ 17

А для Kotlin просто используйте следующие расширения:

fun EditText.showKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

Ответ 18

фрагмент кода.,.

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}

Ответ 19

Это сработало для меня. Вы также можете попробовать скрыть клавиатуру:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Ответ 20

просто добавьте android: windowSoftInputMode = "stateHidden" в файле манифеста...

Ответ 21

final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

Ответ 22

Внутри вашего манифеста:

android:windowSoftInputMode="stateAlwaysVisible" - первоначально запущенная клавиатура. android:windowSoftInputMode="stateAlwaysHidden" - изначально скрытая клавиатура.

Мне нравится использовать также "adjustPan", потому что когда клавиатура запускается, экран автоматически настраивается.

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>

Ответ 23

Все приведенные выше решения (взаимодействие InputMethodManager в OnFocusChangeListener.onFocusChange прослушиватель, прикрепленный к вашему EditText, отлично работает, если у вас есть одно редактирование в действии.

В моем случае у меня есть два изменения.

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

Я заметил, что onFocusChange запускается для tvX с hasFocus = true (показана клавиатура), но затем для tvY с hasFocus = true (скрытая клавиатура). В конце концов, клавиатура не была видна.

Общее решение должно иметь правильный оператор в том случае, если "показать клавиатуру, если текст EditText имеет фокус"

Ответ 24

В разделе onResume() Activity вы можете вызвать метод bringKeyboard();

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }

Ответ 25

Я обнаружил странное поведение, так как в одном из моих приложений мягкая клавиатура автоматически показывалась при вводе активности (в onCreate есть editText.requestFocus()).

Далее, я обнаружил, что это связано с тем, что вокруг макета есть ScrollView. Если я удалю ScrollView, поведение будет таким, как описано в исходной постановке проблемы: только при нажатии на уже сфокусированный editText появляется мягкая клавиатура.

Если это не сработает для вас, попробуйте вставить ScrollView - это безвредно.

Ответ 26

У меня была похожая проблема с использованием анимации просмотра. Поэтому я добавил слушателя анимации, чтобы убедиться, что дождитесь окончания анимации, прежде чем пытаться запросить доступ к клавиатуре на показанном edittext.

    bottomUp.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (textToFocus != null) {
                // Position cursor at the end of the text
                textToFocus.setSelection(textToFocus.getText().length());
                // Show keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });

Ответ 27

Я согласен с raukodraug, поэтому, используя swithview, вы должны запросить/очистить фокус следующим образом:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

С уважением.

Ответ 28

Если EditText находится внутри Recycler или ListView и/или имеет отключенное состояние, используйте код ниже.

public static void showKeyboardByFocus(final View view)
    {
        view.requestFocus();

        InputMethodManager keyboard = SystemMaster.getInputMethodManager();
        keyboard.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);

        Runnable re = new Runnable()
        {
            @Override
            public void run()
            {
                view.setEnabled(true);
                view.requestFocus();
            }
        };

        Handler h = new Handler(Looper.getMainLooper());
        h.postDelayed(re, 360);
    }

Ответ 29

Просто добавьте эту строку в представление EditText:

android:isScrollContainer="true"

и TADA - клавиатура стала появляться автоматически!

У меня была похожая проблема, и я обнаружил это простое и странное решение.

Как уже упоминалось здесь пользователем3392439, появление клавиатуры в фокусе каким-то странным образом связано с присутствием компонента прокрутки в файле XML.

Даже наличие другого представления EditText, которое содержит вышеупомянутую строку в том же XML, приводит к тому, что клавиатура появляется независимо от того, какой из EditTexts в данный момент находится в фокусе.

Если у вас есть хотя бы один видимый вид, содержащий компонент прокрутки, в вашем XML файле - клавиатура автоматически появится в фокусе.

Если прокрутки нет - вам нужно нажать на EditText, чтобы появилась клавиатура.

Ответ 30

Используя Xamarin, это работает для меня внутри фрагмента:

using Android.Views.InputMethods;
using Android.Content;

...

if ( _txtSearch.RequestFocus() ) {
  var inputManager = (InputMethodManager) Activity.GetSystemService( Context.InputMethodService );
  inputManager.ShowSoftInput( _txtSearch, ShowFlags.Implicit );
}