我有EditText
和Button
。点击按钮我想打开EditText
键盘,同时请求关注EditText
,以便用户直接开始输入键盘,文字显示在EditText
}。
但在我的情况下,当我单击按钮时,它会打开键盘,但它不会将焦点设置在EditText
上,因为用户必须再次单击EditText
才能在其上书写。问题是什么任何帮助或建议。
代码点击按钮
m_SearchEditText.requestFocus();
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(m_SearchEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
答案 0 :(得分:33)
确保edittext在触摸模式下可聚焦。你可以两种方式做到这一点。
在xml中:
android:focusableInTouchMode="true"
Java中的:
view.setFocusableInTouchMode(true);
我个人不相信这个参数的XML定义。我总是通过这两行代码请求关注:
view.setFocusableInTouchMode(true);
view.requestFocus();
键盘应无需调用InputMethodManager即可显示。
它适用于大多数情况。一旦它对我不起作用,因为由于处理相当繁重而丢失了对象的引用 - 确保这不是你的问题。
答案 1 :(得分:11)
在我的情况下,它通过在您单击按钮并在另一个视图中聚焦设置后添加处理程序来工作,焦点可以返回到您需要的视图。
把它放在你的代码中:
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
lastview.getEditText().clearFocus();
m_SearchEditText.requestFocus();
InputMethodManager mgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(mLastNameET, InputMethodManager.SHOW_IMPLICIT);
}
}, 100);
我希望它有用
答案 2 :(得分:6)
以下对我有用,应该有所帮助:
EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);
答案 3 :(得分:6)
在 manifest.xml 中写:
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateAlwaysVisible" />
并在m_SearchEditText.requestfocus()
中致电oncreate()
或强>
试试:
if(m_SearchEditText.requestFocus()) {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
答案 4 :(得分:3)
作为this answer的扩展(由于声誉,我没有将其添加为评论......)。
如果要将延迟时间减少到零,请改用handler.post()。 完整代码:
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
lastview.getEditText().clearFocus();
m_SearchEditText.requestFocus();
InputMethodManager mgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(mLastNameET, InputMethodManager.SHOW_IMPLICIT);
}
});
答案 5 :(得分:2)
在saleh sereshki的回答和pauminku的评论之后,我正在使用:
m_SearchEditText.post(new Runnable() {
@Override
public void run() {
m_SearchEditText.requestFocus();
}
});
在Kotlin中等同于:
m_SearchEditText.post { m_SearchEditText.requestFocus() }
答案 6 :(得分:1)
最低限度的Kotlin扩展版本,因为我们应该假装对系统服务的这种钝性调用是不必要的:
fun EditText.requestKeyboardFocus() {
val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
答案 7 :(得分:1)
对焦可以使用这个功能
editText.requestFocus()
您可能会遇到 EditText
两个不同的问题。一个是 EditText
将聚焦但键盘不会打开,因此正如其他答案所说,您必须手动打开键盘。另一个问题是EditText
根本不专注就意味着什么都没发生。
对于打开键盘,您可以在 requestFocus
之后执行此操作:
val manager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
manager?.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
if EditText
根本没有聚焦检查此属性。 EditText
必须可聚焦、可见、启用、可聚焦InTouchMode。在调用 requestFocus
之前启用所有这些。
this.isFocusable = true
this.isFocusableInTouchMode = true
this.visibility = View.VISIBLE
this.isEnabled = true
最后你可以使用这个 kotlin 扩展为你做所有这些:
fun EditText.focus() {
this.isFocusable = true
this.isFocusableInTouchMode = true
this.visibility = View.VISIBLE
this.isEnabled = true
this.isCursorVisible = true
this.post {
(this.context as? Activity)?.runOnUiThread {
this.requestFocus()
val manager =
this.context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
manager?.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
}
}
}
答案 8 :(得分:0)
你还需要两个xml属性来实现这个目标:
android:focusable="true"
android:focusableInTouchMode="true"
将它们添加到EditText以及父布局(这些视图所在的任何布局)。默认情况下,这些都是false,因此不会将焦点放在请求的视图上。
来源:https://developer.android.com/reference/android/view/View.html#attr_android:focusable
根据复选框选择显示EditText后,在代码中动态添加下一个和前一个焦点。
希望这有帮助。
答案 9 :(得分:0)
就我而言,以上所有答案均无效(例如,它们在Nox中无效)。要将焦点设置为EditText
,您可以欺骗它,使其认为用户实际上单击了它。。
所以我使用MotionEvent
,就像这样:
// simulate a click, which consists of ACTION_DOWN and ACTION_UP
MotionEvent eventDown = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_DOWN, 0, 0, 0);
editText.dispatchTouchEvent(eventDown);
eventDown.recycle();
MotionEvent eventUp = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_UP, 0, 0, 0);
editText.dispatchTouchEvent(eventUp);
eventUp.recycle();
// To be on the safe side, also use another method
editText.setFocusableInTouchMode(true);
editText.requestFocus();
editText.requestFocusFromTouch();
答案 10 :(得分:0)
如果启用了EditText,则上述解决方案将起作用。
在我的代码中,我曾一度禁用视图,并尝试稍后请求焦点而不启用。 如果以上方法均无效,请启用EditText,然后继续上述解决方案。
就我而言,
etpalletId.isEnabled = true
etpalletId.text!!.clear()
etpalletId.requestFocus()
etpalletId.isCursorVisible = true
答案 11 :(得分:0)
我正在组合一些答案,找到了以下解决方案:
fun Fragment.focusEditText(editText: EditText) {
Timer("Timer", false).schedule(50) {
requireActivity().runOnUiThread(java.lang.Runnable {
editText.isFocusableInTouchMode = true
editText.requestFocus()
val manager =
requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
manager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
})
}
计时器延迟可确保焦点请求正常工作并手动打开键盘,因为它对我没有隐式工作。