Android TextField:以编程方式设置焦点+软输入


80

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

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

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

任何的想法 ?

Answers:


148

先生,请尝试以下操作:

edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

我不确定,但这在某些手机(某些旧设备)上可能是必需的:

final InputMethodManager inputMethodManager = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);

2
结果与单独的requestFocus()相同...字段获得焦点,但未触发软键盘。
sdabet 2011年

12
我终于解决了发出调用field.requestFocus()onResume()活动(而不是方法onCreate())。不完全知道它为什么起作用...
sdabet 2011年

31
在将视图实际放在屏幕上之前,无法对其进行聚焦。当onCreate()持有UI线程时无法完成此操作,因此视图直接在onCreate()之后和onResume()之前进行布局。:)
pgsandstrom

@fiddler之所以起作用,onResume是因为onResumeafter之后被调用onCreate,所以field直到onCreate运行才存在。看到这里:developer.android.com/reference/android/app/…
兰迪

3
很好的建议,老兄。我确实声明;这是当之无愧的!
兆瓦。

59

这是对我有用的代码。

edittext.post(new Runnable() {
    public void run() {
        edittext.requestFocusFromTouch();
        InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        lManager.showSoftInput(edittext, 0);
    }
});

而已!请享用 ;)


谢谢,这个为我工作。EditText当用户点击按钮时,我以编程方式添加。
dumbfingers

EditText从对话框模态添加了一个。Android设置了一些标志,这些标志导致此控件不接收任何触摸。如果在可运行对象中添加该字段,则不会设置标志。
JeffRegan 2014年

它看起来像InputTypeEditText是由Android的设置为null。如果设置了InputType,它应该可以工作。
JeffRegan 2014年

对我来说唯一有效的解决方案(如果我使用InputMethodManager强制显示键盘,则无法隐藏它)
Pavel

没有其他方法对我有用,但是这个方法可以。我希望有一个框供用户单击以打开编辑对话框视图,而不是单击编辑行以单击EditText视图。在电话上,编辑行会失去大部分功能,因为编辑对话视图会覆盖整个屏幕,因此用户无论如何都看不到编辑行,包括打字时输入的字母。
Androidcoder

6

下面的代码 为我工作,后其他两个答案 ,我没有工作

@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 ms的延迟。奇怪吧?也更改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()似乎在启动器上触发了触摸事件。真奇怪
EpicPandaForce 2015年

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

0

就我而言,我想显示虚拟键盘,但不引用特定的文本框,因此我使用了已接受答案的第一部分来关注

edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

然后显示虚拟键盘

InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.