如何在 EditText 获得焦点时显示软键盘

544
我希望在EditText聚焦时(如果设备没有物理键盘),自动显示软键盘,但我有两个问题:
  1. 当我的Activity被显示时,我的EditText已经聚焦了,但是键盘没有显示出来。我需要再次点击它才能显示键盘(应该在Activity显示时就自动显示键盘)。

  2. 当我在键盘上点击完成时,键盘会消失,但是EditText仍然保持聚焦状态,这不是我想要的(因为我的编辑已经完成了)。

总之,我的问题是需要像iPhone一样,保持键盘与我的EditText状态同步(聚焦/未聚焦),并且如果有物理键盘,不要显示软键盘。

我只有一个基本的EditText,如下所示: <EditText android:id="@+id/myEditText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:imeOptions="actionDone" />在我的活动中,我有这个:EditText editTxt = (EditText) findViewById(R.id.myEditText); editTxt.requestFocus(); - Ludovic Landry
2
这比这篇帖子中的任何答案都更有帮助:https://dev59.com/tHE95IYBdhLWcg3wOLQ1#2418314 - Armel Larcier
49个回答

2
如果EditText位于Recycler或ListView内部,并且此处处于禁用状态,请使用以下代码。
public static void showKeyboardByFocus(final View view)
    {
        view.requestFocus();

        InputMethodManager keyboard = SystemMaster.getInputMethodManager();
        keyboard.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);

        Runnable re = new Runnable()
        {
            @Override
            public void run()
            {
                view.setEnabled(true);
                view.requestFocus();
            }
        };

        Handler h = new Handler(Looper.getMainLooper());
        h.postDelayed(re, 360);
    }

这对我很有帮助!好奇:这个360常数是从哪里来的? - yonix
1
360 我进行了几次测试后发现有一个延迟时间,最好不要缩短它,以免代码出错。 - Ali Bagheri

2

我使用这个扩展函数来在Kotlin中显示键盘。

fun EditText.requestFocusWithKeyboard() {
    post {
        dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 0f, 0f, 0))
        dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 0f, 0f, 0))
        setSelection(length())
    }
}

您可以直接这样调用:
editText.requestFocusWithKeyboard()

除了非常方便:

  1. 您不必担心在所有可能的情况下关闭它,例如当您使用InputMethodManager.SHOW_FORCED返回时。
  2. 除了请求焦点之外,它还设置了选择(将光标设置到文本末尾)

2

对于Kotlin扩展,请使用以下内容。

fun EditText.toggle() {
   requestFocus()
   val imm = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
   imm.showSoftInput(this, 0)
}

通过以下方式访问:

editText.toggle()

1

我同意raukodraug的观点,因此在使用switchview时,您必须像这样请求/清除焦点:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

问候。


1

这很疯狂,但实际上确实有效

fun showKeyboard(view: View) {
    try {
        InputMethodManager::class.java.getMethod(
                "showSoftInputUnchecked",
                Int::class.javaPrimitiveType,
                ResultReceiver::class.java
        ).apply {
            isAccessible = true
            invoke(view.context.inputMethodManager, 0, null)
        }
    }
    catch (e: Exception) {
       e.printStackTrace()
    }
}

1

我使用计时器。当编辑文本框获得焦点时,键盘会显示。

    edittext = (EditText) findViewById(R.id.edittext );
    edittext.requestFocus();
    edittext.setFocusableInTouchMode(true);
    if (edittext.requestFocus()) {
        final Thread timer = new Thread() {
            public void run() {
                try{
                    sleep(500);
                    InputMethodManager imm =(InputMethodManager) getApplicationContext().getSystemService(INPUT_METHOD_SERVICE);
                    imm.showSoftInput(edittext, SHOW_IMPLICIT);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        timer.start();

谢谢兄弟...这对我有用...我已经尝试了两天...非常感谢... - Aqeel Mughal

1

强制显示键盘,请使用以下代码:

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

1
我发现一个奇怪的行为,因为在我的一个应用中,软键盘在进入活动时自动显示(onCreate中有editText.requestFocus())。
进一步挖掘后,我发现这是因为布局周围有一个ScrollView。如果我删除ScrollView,则行为与原始问题描述一样:只有在点击已经聚焦的editText时,软键盘才会出现。
如果对您不起作用,请尝试放置一个ScrollView--它无论如何都是无害的。

1
在尝试了这里的每个答案后,键盘仍然没有显示出来。我花了几个小时来解决这个问题,所以希望有人不要在将来浪费时间。
对于我的情况,问题并不是编程问题,我正在使用一个带有硬件键盘的手机模拟器进行测试,因此默认情况下不会显示软件键盘。为了解决这个问题,您需要确保在模拟器中启用了显示软输入,方法是关闭硬件键盘或启用软键盘。
我只在API-15和16上遇到过这个问题。以下是如何操作的屏幕截图。
在Geny Motion模拟器上:

enter image description here enter image description here

在Android Studio模拟器上:

enter image description here


1
在activity()的onCreate()方法中,调用editText的requestFocus()方法,并且当键盘上的“完成”按钮被点击时,调用同一个editText的clearFocus()方法。请保留html标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接