EditText请求焦点不起作用

时间:2013-07-11 06:02:29

标签: android android-edittext

我有EditTextButton。点击按钮我想打开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);

12 个答案:

答案 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)
    })
}

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