34

我有一个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);
4

14 回答 14

54

确保edittext在触摸模式下可聚焦。你可以通过两种方式做到这一点。

在 xml 中:

android:focusableInTouchMode="true"

在 Java 中:

view.setFocusableInTouchMode(true);

我个人不相信这个参数的 XML 定义。我总是通过这两行代码来请求焦点:

view.setFocusableInTouchMode(true);
view.requestFocus();

键盘应该会出现在自己身上,而不需要调用 InputMethodManager。

它适用于大多数情况。一旦它对我不起作用,因为我由于处理繁重而丢失了对对象的引用 - 确保这不是您的问题。

于 2013-07-11T09:33:57.113 回答
18

在我的情况下,它通过在您单击按钮并在另一个视图中设置焦点后添加一个处理程序来工作,焦点可以返回到您需要的视图。

只需将其放入您的代码中:

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);

我希望它有帮助

于 2015-09-17T22:24:12.923 回答
8

在您的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);
}
于 2013-07-11T06:37:32.073 回答
8

以下对我有用,应该会有所帮助:

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);
于 2013-07-11T06:05:43.060 回答
5

极简的 Kotlin 扩展版本,因为我们应该假装这些对系统服务的钝调用是不必要的:

fun EditText.requestKeyboardFocus() {
    val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
于 2018-10-09T03:26:00.837 回答
5

根据saleh sereshki的回答和pauminku的评论,我正在使用:

m_SearchEditText.post(new Runnable() {
            @Override
            public void run() {
                m_SearchEditText.requestFocus();
            }
        });

在 Kotlin 中相当于:

m_SearchEditText.post { m_SearchEditText.requestFocus() }
于 2019-10-15T02:49:25.490 回答
5

作为此答案的扩展(由于声誉,我没有将其添加为评论......)。

如果您想将延迟时间减少到零,请改用 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);
    }
});
于 2016-12-29T10:51:40.623 回答
4

你还需要两个 xml 属性来实现这一点:

android:focusable="true"
android:focusableInTouchMode="true"

将它们添加到 EditText 以及父布局(这些视图所在的任何布局)。默认情况下,这些都是 false,因此焦点不会放在请求的视图上。

来源:https ://developer.android.com/reference/android/view/View.html#attr_android:focusable

根据复选框选择显示 EditText 后,在代码中动态添加下一个和上一个焦点。

希望这可以帮助。

于 2016-05-18T12:25:07.560 回答
1

要集中注意力,您可以使用此功能

editText.requestFocus()

你可以有两个不同的问题EditText。一个是EditText会集中但键盘不会打开,所以正如其他答案所说,你必须手动打开键盘。其他问题EditText根本不会集中,意味着什么也没发生。

打开键盘,您可以在以下操作后执行此操作requestFocus

val manager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
manager?.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)

如果EditText 根本不关注此属性。EditText必须是可聚焦的、可见的、启用的、focusableInTouchMode。在调用之前启用所有这些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)
        }
    }
}
于 2021-07-25T22:26:09.347 回答
0

如果启用了 EditText,上述解决方案将起作用。

在我的代码中,我曾一度禁用了视图,并试图稍后在不启用的情况下请求焦点。如果上述方法均无效,请启用 EditText,然后继续执行上述解决方案。

就我而言,它就像,

 etpalletId.isEnabled = true
 etpalletId.text!!.clear()
 etpalletId.requestFocus()
 etpalletId.isCursorVisible = true
于 2020-04-13T11:08:02.537 回答
0

如果没有,请确保您的视图是可聚焦的,然后将其设置为可聚焦的:

yourView.setFocusable(true);
yourView.setFocusableInTouchMode(true);

之后设置焦点如下:

yourView.requestFocus() 

如果这不起作用,那么使用这个:

yourView.post(new Runnable() {
@Override
public void run() {
    yourView.requestFocus();
}
});

这将起作用,其背后的原因是没有加载整个 UI 以便将焦点设置在特定的 UI 元素上。在这种情况下,可能会忽略您的明确请求的系统会覆盖焦点。因此,如果您使用后台线程请求焦点(是的,我的意思是使用 Thread 或 Runnable 类),它应该可以解决问题。

欲了解更多信息,请访问此链接: https ://medium.com/@saishaddai/til-requestfocus-not-working-22760b417cf9

于 2022-01-05T20:02:12.983 回答
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)
    })
}

计时器延迟确保焦点请求正常工作并且手动打开键盘,因为它对我来说没有隐含地工作。

于 2020-10-24T17:03:20.977 回答
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();
于 2019-11-11T05:19:22.840 回答
0

对于我的代码中的一些特殊情况,我这样做:

later {
    showKeyboard()
    titleEdit.requestFocus()
}

在正常代码中,它应该如下所示:

view.post {
    (view.context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager)
        .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
            InputMethodManager.HIDE_IMPLICIT_ONLY)
    titleEdit.requestFocus()
}

说明:在某些情况下,toggleSoftInput 似乎是唯一的方法,但它以某种方式窃取焦点,并且在某些情况下,它仅在初始化后的代码 tun 中工作,因此必须发布以供以后执行。

于 2021-08-13T19:26:28.070 回答