我想在聚焦 EditText
时自动显示软键盘(如果设备没有物理键盘),我有两个问题:
当显示我的 Activity 时,我的 EditText 已聚焦但未显示键盘,我需要再次单击它以显示键盘(它应该在显示我的 Activity 时显示)。当我在键盘上单击完成时,键盘被关闭但 EditText 保持焦点并且你不想要(因为我的编辑已完成)。
继续,我的问题是在 iPhone 上有更多类似的东西:它使键盘与我的 EditText
状态(聚焦/不聚焦)保持同步,如果有物理键盘,当然不会显示软键盘。
要强制出现软键盘,您可以使用
EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
yourEditText.requestFocus();
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);
}
我有同样的问题。在 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, 0f, 0f, 0));
yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 0f, 0f, 0));
}
}, 200);
它对我有 100 毫秒的延迟,但没有任何延迟或只有 1 毫秒的延迟就失败了。
代码的注释部分显示了另一种方法,该方法仅适用于某些设备。我在 OS 版本 2.2(模拟器)、2.2.1(真实设备)和 1.6(模拟器)上进行了测试。
这种方法为我节省了很多痛苦。
EditText
的点击。对于阅读本文的其他人,您也可以在 yourEditText
小部件本身上使用 View.postDelayed()
方法,而不是创建新的 Handler
。
要使键盘出现,请使用
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
这种方法比直接调用 InputMethodManager 更可靠。
要关闭它,请使用
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
InputMethodManager
更可靠吗? (一方面,它不起作用,不像 raukodraug 的解决方案。)
当没有其他工作时,强制显示它:
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
稍后,如果您想关闭它,例如在 onPause() 中,您可以调用:
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
以下代码来自 Google 的 SearchView 4.1 源代码。似乎可以工作,在较低版本的 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);
}
}
}
然后除此之外,在创建控件/活动时需要添加以下代码。 (在我的情况下,它是一个复合控件,而不是一个活动)。
this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
setImeVisibility(hasFocus);
}
});
setImeVisibility(hasFocus)
?
android:windowSoftInputMode="stateAlwaysVisible"
->在清单文件中。
edittext.requestFocus();
->在代码中。
这将打开软键盘,当活动出现时,编辑文本具有请求焦点。
manifest
中提及!
我最近在一些简单的情况下使用下面的代码获得了一些运气。我还没有完成所有的测试,但是......
EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 0f, 0f, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 0f, 0f, 0));
很快键盘就出现了。
您可以尝试强制出现软键盘,它对我有用:
...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
对于 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)
}
有时 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
根本不适合我。
我想我需要设置输入模式:(在清单中的 Activity 组件中)
android:windowSoftInputMode="stateVisible"
要隐藏键盘,请使用这个:
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
并显示键盘:
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
onStart()
中调用它,并且可以使用 getDialog().getWindow()
作为 getActivity().getWindow()
的替代。
对于片段,确保其工作:
displayName = (EditText) view.findViewById(R.id.displayName);
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Kotlin
用于显示键盘焦点的扩展程序。
这是先前响应的组合,其中要么太长要么不完整。
这个扩展在请求焦点后显示软键盘的消息队列上发布一个可运行的:
fun View.showSoftKeyboard() {
post {
if (this.requestFocus()) {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
}
}
之后需要时从任何视图调用它:
editText.showSoftKeyboard()
信不信由你,当我发现活动动画可以禁用软键盘时,我的软键盘问题得到了解决。当您使用
i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
和
overridePendingTransition(0, 0);
它可以隐藏软键盘并且没有办法显示它。
我在各种不同的情况下遇到了同样的问题,我发现的解决方案在某些情况下有效,但在其他情况下无效,所以这里有一个组合解决方案,适用于我发现的大多数情况:
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);
}
});
}
}
}
editText.post(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
});
我在这里结合了所有内容,对我来说它有效:
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();
}
}
它对我有用。您也可以尝试使用它来显示键盘:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
只需在 EditText 视图中添加这一行:
android:isScrollContainer="true"
和 TADA - 键盘开始自动出现!
我有类似的问题,并发现了这个简单而奇怪的解决方案。
正如 user3392439 在这里已经提到的那样,键盘在焦点上的出现与 XML 文件中滚动组件的存在莫名其妙地联系在一起。
即使在同一 XML 中包含上述行的另一个 EditText 视图的存在也会使键盘出现,无论当前哪个 EditTexts 聚焦。
如果您的 XML 文件中至少有一个包含滚动组件的可见视图 - 键盘将自动出现在焦点上。
如果没有滚动 - 那么您需要单击 EditText 以使键盘出现。
requesFocus()
,这是除了显式 showSoftInput SHOW_FORCED 之外的唯一方法
代码片段。 . .
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);
}
});
}
在您的清单中:
android:windowSoftInputMode="stateAlwaysVisible"
- 最初启动的键盘。 android:windowSoftInputMode="stateAlwaysHidden"
- 最初隐藏的键盘。
我也喜欢使用 "adjustPan"
,因为当键盘启动时,屏幕会自动调整。
<activity
android:name="YourActivity"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
只需在清单文件中添加 android:windowSoftInputMode="stateHidden" ...
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
toggleSoftInput
已弃用。
没有一个答案对我有用。这是一个简单的方法。
searchEditText.setVisibility(View.VISIBLE);
final Handler handler=new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
searchEditText.requestFocus();
}
}, 400);
只是将 requestFocus() 方法延迟了 400 毫秒。
上面给出的所有解决方案(如果您在活动中进行单个编辑,则附加到 EditText 的 OnFocusChangeListener.onFocusChange 侦听器中的 InputMethodManager 交互工作正常。
就我而言,我有两个编辑。
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 是针对具有 hasFocus=true (显示键盘)的 tvX 触发的,但随后针对具有 hasFocus=true (隐藏键盘)的 tvY 触发。最后,没有可见的键盘。
如果“如果 EditText 文本有焦点则显示键盘”一般解决方案应该有正确的语句
在 Activity 的 onResume() 部分中,您可以调用方法 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;
}
WidgetUtils.showKeyboard
是什么?这是这里最重要的一点。
正如我在官方文档上阅读的那样,我认为这是最好的答案,只需将 View 传递给 EditText 等参数,但 showSoftKeyboard 似乎不适用于横向
private fun showSoftKeyboard(view: View) {
if (view.requestFocus()) {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}
}
private fun closeSoftKeyboard(view: View) {
if (view.requestFocus()) {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}
}
对于科特林:
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
fun showKeyboard() {
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
}
fun hideKeyboard() {
imm.hideSoftInputFromWindow(phoneNoInputTxt.windowToken, 0);
}
然后只需调用你想要的!
这是我从 Square 获得的更可靠的解决方案:
fun View.focusAndShowKeyboard() { /** * 当窗口已经有焦点时调用。 */ fun View.showTheKeyboardNow() { if (isFocused) { post { // 我们仍然发布调用,以防我们收到窗口焦点通知 // 但 InputMethodManager 尚未正确设置。 val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) } } } requestFocus() if (hasWindowFocus()) { // 无需等待窗口获得焦点。 showTheKeyboardNow() } else { // 我们需要等到窗口获得焦点。 viewTreeObserver.addOnWindowFocusChangeListener( object : ViewTreeObserver.OnWindowFocusChangeListener { override fun onWindowFocusChanged(hasFocus: Boolean) { // 此通知将在 InputMethodManager 设置之前到达。 if (hasFocus) { this@focusAndShowKeyboard.showTheKeyboardNow() // 这很重要完成后删除此侦听器。viewTreeObserver.removeOnWindowFocusChangeListener(this) } } }) } }
来自 here 的代码积分。
onWindowFocusChanged
中的 if 语句后对我有用。谢谢
yourEditText.requestFocus()
一起使用:stackoverflow.com/questions/8991522/…