Как показать мягкую клавиатуру, когда 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 );
}