如何以编程方式在EditText上设置焦点(并显示键盘)


179

我有一个包含一些这样的视图的布局:

<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>

如何以EditText编程方式设置焦点(显示键盘)?

我已经尝试过了,它只有在Activity正常启动时才起作用,但是当在中启动时TabHost,它不起作用。

txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();


Answers:


352

试试这个:

EditText editText = (EditText) findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

http://developer.android.com/reference/android/view/View.html#requestFocus()


与代码更新,以迫使键盘从这个答案显示:stackoverflow.com/questions/5105354/...
大卫·梅里曼

5
它仅在我正常启动活动时才起作用,但是当我在
TabHost

27
这行不通。这对我有用InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
居纳伊居尔泰金

5
“这对兄弟不起作用”。在某些情况下,您需要从postDelayed()异步调用此代码。我遇到了一种情况,当用户在对话框上按“确定”后必须打开键盘。当对话框关闭时,焦点变得混乱了。因此,我已经从postDelayed()调用了上面的代码。在对话框关闭后执行。利润。
Danylo Volokh,2013年

2
我以237的高分通过了答案,以62的高分通过了“我的兄弟不起作用”🤔我对其进行了测试,得出了自己的看法,并且效果很好!)
Daniel

165

用:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

20
在尝试了5种以上其他方法之后,这是唯一一个对我View
William

13
即使现场失去焦点,此建议也会导致键盘固定。
直到

2
是的,它也对我有用,并且imm.showSoftInput()不起作用。
Spark.Bao

8
尽管此方法确实有效,但它有一个缺点,使用“主页”按钮(硬件)退出应用程序会使键盘显示在屏幕上。您将必须按下返回按钮(硬件)以隐藏键盘,因为它在您的主屏幕上无用。
Adrien Horgnies '16

其他方法对我不起作用,但对我却有效。谢谢。
伊曼·阿克巴里

53

这对我有用,多亏了

显示键盘:

editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);

隐藏键盘:

InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2
唯一的完整解决方案。谢谢。
korro

41

showSoftInput 根本没有为我工作。

我认为我需要设置输入模式:(android:windowSoftInputMode="stateVisible"在清单的“活动”组件中)

希望对您有所帮助!


5
当活动开始时,这只是显示了键盘。
威廉

1
太棒了:)尝试了很多答案,但只有这样做,我才能使它起作用:)非常感谢。
斯里肯斯

非常低估的答案
Avinash R

完美的答案。仅与“ editText.requestFocus()”一起使用。谢谢。
AVJ

37
final EditText tb = new EditText(this);
tb.requestFocus();
tb.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT);
    }
}, 1000);

1
为了使它显示在onResume()中,我必须这样做。没有延迟,使用此线程中描述的每个解决方案都不会发生任何事情。
FranticRock '16

1
在那里。那就是我想要的答案。不过,您并不需要一秒钟的延迟。我只试了150毫秒,效果也不错。
Rubberduck

1
谢谢!即使在0 ms(tb.post({ showKeyboard(tb) }))内也可以使用。注意,我们需要一个EditText视图(tb),而不是一个片段视图。
CoolMind

16

这是如何制作用于显示和隐藏软键盘的kotlin扩展:

fun View.showKeyboard() {
  this.requestFocus()
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun View.hideKeyboard() {
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

然后,您可以执行以下操作:

editText.showKeyboard()
// OR
editText.hideKeyboard()

与休息相比,这是一个更好的解决方案
d-feverx

5

我建议使用LifecycleObserver这是一部分具有生命周期感知组件处理生命周期安卓Jetpack的

片段/活动出现时,我想打开和关闭键盘。首先,为EditText 定义两个扩展功能。您可以将它们放在项目中的任何位置:

fun EditText.showKeyboard() {
    requestFocus()
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

然后定义一个LifecycleObserver,当Activity / Fragment到达onResume()或时,它将打开和关闭键盘onPause

class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) :
    LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun openKeyboard() {
        editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun closeKeyboard() {
        editText.get()?.hideKeyboard()
    }
}

然后将以下行添加到您的任何片段/活动中,您可以随时重复使用LifecycleObserver。例如片段:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    // inflate the Fragment layout

    lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText)))

    // do other stuff and return the view

}

3

这是用于隐藏和显示键盘的KeyboardHelper类

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * Created by khanhamza on 06-Mar-17.
 */

public class KeyboardHelper {
public static void hideSoftKeyboard(Context context, View view) {
    if (context == null) {
        return;
    }
    view.requestFocus();
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }, 1000);
}

public static void hideSoftKeyboard(Context context, EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
        }
    }, 1000);
}


public static void openSoftKeyboard(Context context, EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
        }
    }, 1000);
}

}


0

第一种方式

    etPassword.post(() -> {
        etPassword.requestFocus();
        InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);
    });

第二种方式

在清单中:

    <activity
        android:name=".activities.LoginActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateVisible"/>

在代码中:

etPassword.requestFocus();

0

我尝试了很多方法,但仍无法正常工作,不确定是因为我正在使用从片段到包含编辑文本的活动的共享过渡。

顺便说一句,我的edittext也包装在LinearLayout中。

我添加了一点延迟来请求焦点,以下代码对我有用:(Kotlin)

 et_search.postDelayed({
     editText.requestFocus()

     showKeyboard()
 },400) //only 400 is working fine, even 300 / 350, the cursor is not showing

showKeyboard()

 val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)

0
editTxt.setOnFocusChangeListener { v, hasFocus ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (hasFocus) {
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            } else {
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }

-1

我无法单独获得这些答案。对我来说,解决方案是将它们结合起来:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
editText.requestFocus();
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

我不确定为什么这对我来说是必需的-根据文档,似乎这两种方法都应该自己工作。


这绝对不是一个好习惯。可能是Activity或Fragment事务正在与软键盘干涉,或者Input Method标志没有正确设置,但是无论哪种方式,都不应使用此解决方案。
马塞尔兄弟
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.