Android TextField:以编程方式设置焦点+软输入
Posted
技术标签:
【中文标题】Android TextField:以编程方式设置焦点+软输入【英文标题】:Android TextField : set focus + soft input programmatically 【发布时间】:2011-12-26 04:56:01 【问题描述】:在我看来,我有一个搜索 EditText,我想以编程方式触发该字段上单击事件的行为,即,将焦点放在文本字段上,并在必要时显示软键盘(如果没有可用的硬键盘)。
我试过field.requestFocus()
。该字段实际上获得焦点,但未显示软键盘。
我试过field.performClick()
。但这只会调用该字段的 OnClickListener。
有什么想法吗?
【问题讨论】:
【参考方案1】:好先生,试试这个:
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
我不确定,但某些手机(某些旧设备)可能需要这样做:
final InputMethodManager inputMethodManager = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);
【讨论】:
与单独的 requestFocus() 结果相同...字段获得焦点但未触发软键盘。 我终于解决了在活动的onResume()
方法中调用field.requestFocus()
发出的问题(而不是onCreate()
)。不完全知道它为什么起作用......
视图在实际布局到屏幕上之前无法获得焦点。这在 onCreate() 持有 UI 线程时无法完成,因此视图直接布置在 onCreate() 之后和 onResume() 之前。 :)
@fiddler 它在onResume
中工作,因为onResume
在onCreate
之后被调用,所以field
在onCreate
运行之前不存在。见这里:developer.android.com/reference/android/app/…
很好的建议,老兄。我声明;这值得一票!【参考方案2】:
这是对我有用的代码。
edittext.post(new Runnable()
public void run()
edittext.requestFocusFromTouch();
InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
lManager.showSoftInput(edittext, 0);
);
就是这样!享受;)
【讨论】:
谢谢,这个对我有用。当用户点击按钮时,我以编程方式添加EditText
。
我从对话框模式中添加了一个EditText
。 Android 设置了一些标志,导致此控件无法接收任何触摸。如果您在可运行文件中添加该字段,则不会设置标志。
看起来EditText
的InputType
被Android 设置为null。如果你设置InputType
,它应该可以工作。
对我来说唯一可行的解决方案(如果我使用 InputMethodManager 显示强制键盘,那么我无法隐藏它)
其他方法都不适合我,但是这个方法可以。我希望有一个框供用户单击以打开编辑对话视图,而不是让编辑行单击以打开 EditText 视图。在手机上,编辑行失去了大部分功能,因为编辑对话视图覆盖了整个屏幕,因此用户无论如何都看不到编辑行,包括输入时输入的字母。【参考方案3】:
以下代码 对我有用,在其他两个答案 对我不起作用之后:
@Override
public void onResume()
super.onResume();
SingletonBus.INSTANCE.getBus().register(this);
//passwordInput.requestFocus(); <-- that doesn't work
passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen
ShowKeyboard
在哪里
private class ShowKeyboard implements Runnable
@Override
public void run()
passwordInput.setFocusableInTouchMode(true);
// passwordInput.requestFocusFromTouch();
passwordInput.requestFocus();
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
输入成功后,我还要确保隐藏键盘
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(getView().getWindowToken(), 0);
从技术上讲,我只是在运行软键盘显示请求之前添加了 300 毫秒的延迟。很奇怪,对吧?还将requestFocus()
更改为requestFocusFromTouch()
。
编辑:不要使用requestFocusFromTouch()
它会给启动器一个触摸事件。坚持requestFocus()
。
EDIT2:在对话框 (DialogFragment
) 中,使用以下内容
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
而不是
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
【讨论】:
requestFocusFromTouch()
似乎触发了启动器上的触摸事件。这很奇怪。
为了隐藏键盘,((InputMethodManager) getActivity()..." 代码行是否也需要更改以用于 DialogFragment 或者您上面提到的代码行是否足够?
它应该很可能会工作,但你可以随时尝试看看【参考方案4】:
在我的例子中,我想显示虚拟键盘而不引用特定的文本框,所以我使用了 focus 接受答案的第一部分:
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
然后我显示虚拟键盘:
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
【讨论】:
【参考方案5】:对于kotlin,使用扩展函数实现如下
fun View.showSoftKeyboard()
this.requestFocus()
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
【讨论】:
【参考方案6】: field.post(new Runnable()
@Override
public void run()
field.requestFocus();
field.onKeyUp(KeyEvent.KEYCODE_DPAD_CENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER));
);
【讨论】:
【参考方案7】:就我而言,这解决了所有问题:
val inputMethodManager: InputMethodManager =
context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT)
我已经把它放在了RecyclerView Adapter,因为我使用了数据绑定。
我也没有使用edittext.setFocusableInTouchMode(true)
,因为在我的布局中默认是true
。
不要使用这一行:edittext.requestFocus()
。当我删除它时,它开始工作:)
【讨论】:
以上是关于Android TextField:以编程方式设置焦点+软输入的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI:创建自己的 TextField 并以编程方式更改内容
Flutter:如何以编程方式添加 TextField 或 TextFormField
以编程方式在 material-ui Autocomplete TextField 中设置值
获取 Button 和 Textfield 数据,当它们在 swift 5 中以编程方式添加时