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

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

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

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

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

Solutions Collecting From Web of "Как показать мягкую клавиатуру, когда edittext сфокусирован"

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

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

У меня такая же проблема. Сразу после изменения 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 (эмулятор).

Такой подход спас меня от боли.

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

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

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

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

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

Следующий код разграблен из исходного кода Google для 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); } }); 

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

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

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

edittext.requestFocus(); -> в коде.

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

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

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

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

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

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

Иногда ответ 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()); } } }); 

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

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

 android:windowSoftInputMode="stateVisible" 

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

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

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

 i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 

а также

 overridePendingTransition(0, 0); 

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

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

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

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

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

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

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

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

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

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

 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); } }); } } } 
 final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); 

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

 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); } }); } 
 editText.post(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); } }); 

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

Все приведенные выше решения (взаимодействие 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 имеет фокус»

В разделе 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; } 

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

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

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

У меня была аналогичная проблема с использованием анимации просмотра . Поэтому я поставил прослушиватель анимации, чтобы убедиться, что дождитесь окончания анимации, прежде чем пытаться запросить доступ к клавиатуре на показанном 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) { } }); 

Я согласен с 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); } }); 

С уважением.

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

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

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

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

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

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

Я сделал этот класс помощи. Просто передайте контекст и представление, которое вы хотите сфокусировать и показать клавиатуру и после скрытой клавиатуры. Я надеюсь, что это помогает.

 public class FocusKeyboardHelper { private View view; private Context context; private InputMethodManager imm; public FocusKeyboardHelper(Context context, View view){ this.view = view; this.context = context; imm = (InputMethodManager) context.getSystemService(context.INPUT_METHOD_SERVICE); } public void focusAndShowKeyboard(){ view.requestFocus(); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); } public void hideKeyBoard(){ imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } 

}

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

Добавьте эту строку тоже не забывайте

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

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

 public class WellBehavedEditText extends EditText { private InputMethodManager inputMethodManager; private boolean showKeyboard = false; public WellBehavedEditText(Context context) { super(context); this.initializeWellBehavedEditText(context); } public WellBehavedEditText(Context context, AttributeSet attributes) { super(context, attributes); this.initializeWellBehavedEditText(context); } public WellBehavedEditText(Context context, AttributeSet attributes, int defStyleAttr) { super(context, attributes, defStyleAttr); this.initializeWellBehavedEditText(context); } public WellBehavedEditText(Context context, AttributeSet attributes, int defStyleAttr, int defStyleRes) { super(context, attributes, defStyleAttr, defStyleRes); this.initializeWellBehavedEditText(context); } private void initializeWellBehavedEditText(Context context) { this.inputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); final WellBehavedEditText editText = this; this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if(showKeyboard) { showKeyboard = !(inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_FORCED)); } } }); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(!focused) this.showKeyboard = false; super.onFocusChanged(focused, direction, previouslyFocusedRect); } @Override public boolean requestFocus(int direction, Rect previouslyFocusedRect) { boolean result = super.requestFocus(direction, previouslyFocusedRect); this.showKeyboard = true; final WellBehavedEditText self = this; this.post(new Runnable() { @Override public void run() { showKeyboard = !(inputMethodManager.showSoftInput(self, InputMethodManager.SHOW_FORCED)); } }); return result; } }