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 中工作,因为onResumeonCreate 之后被调用,所以fieldonCreate 运行之前不存在。见这里: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 设置了一些标志,导致此控件无法接收任何触摸。如果您在可运行文件中添加该字段,则不会设置标志。 看起来EditTextInputType 被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 中以编程方式添加时

以编程方式设置 android:animateLayoutChanges

以编程方式打开 Android 设置