【问题标题】:Android TextField : set focus + soft input programmaticallyAndroid TextField:以编程方式设置焦点+软输入
【发布时间】:2011-12-26 04:56:01
【问题描述】:

在我看来,我有一个搜索 EditText,我想以编程方式触发该字段上单击事件的行为,即,将焦点放在文本字段上,并在必要时显示软键盘(如果没有可用的硬键盘)。

我试过field.requestFocus()。该字段实际上获得焦点,但未显示软键盘。

我试过field.performClick()。但这只会调用该字段的 OnClickListener。

有什么想法吗?

【问题讨论】:

    标签: android android-edittext


    【解决方案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()。当我删除它时,它开始工作:)

          【讨论】:

            猜你喜欢
            • 2020-02-15
            • 1970-01-01
            • 1970-01-01
            • 2021-10-30
            • 2013-01-30
            • 1970-01-01
            • 1970-01-01
            • 2017-08-26
            • 1970-01-01
            相关资源
            最近更新 更多