当Activity启动时显示软键盘

70

我有两个活动,A和B。当A开始时,它会检查一个条件,如果为真,则调用startActivityForResult()启动B。因为B只接受文本输入,所以在B启动时自动弹出软键盘是有意义的。当活动开始时,EditText已经获得焦点并准备好输入。

问题在于,即使在B的<activity>标签下设置了windowSoftInputMode="stateAlwaysVisible",键盘也从未显示过。我还尝试将其设置为stateVisible。由于它不会自动显示,因此我必须点击EditText才能显示它。

有没有人知道可能的解决方案?


1
你尝试过在文本框上使用requestFocus吗?(盲目尝试,但) - Roy Truelove
10个回答

103

对我来说最好的方法是在 Activity B 的 Android 清单中添加以下代码:

android:windowSoftInputMode="stateVisible"


2
我应该指出,到目前为止,这对于运行2.2的Nexus One效果很好,但是一些带有2.1版本的Motorola设备似乎忽略了它。 - Leo
感谢您,要以编程方式实现此操作,请查看https://dev59.com/W2035IYBdhLWcg3wJcnT。 - David Magalhães
使用 stateVisible 会导致设备方向改变时键盘重新出现。如果不希望出现这种行为,则 stateVisible 不是解决方案。 - Alex Peters
3
作为新手,你必须在 <activity android:name=".MyActivity" 后面添加这行代码。 - LePatay
这种方法的问题在于它无法通过中央库传播到许多应用程序。您需要在所有清单文件中重复此行为。编程解决方案也可以解决这个问题。 - Saeed Neamati

22

最简单的解决方案:将

放入其中。

android:windowSoftInputMode = "stateVisible" 

在 AndroidManifest.xml 文件的 Activity 部分


对于像我这样的新手:您必须在 <activity android:name=".MyActivity" 之后立即添加此行。 - LePatay

14

如果调用 EditText 的 requestFocus() 方法没有显示它,也许这个方法可以解决问题:

InputMethodManager imm = (InputMethodManager)getSystemService(
    Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditText, 0);

点击此处获取更多信息。


1
只要您没有在其他地方(如清单或代码中)指定不同的软输入状态,这段代码应该可以正常工作。例如:this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); - topwik

11

对我来说,只有这个解决方案有效:

在清单文件中为该活动添加以下内容:

android:windowSoftInputMode="stateVisible|adjustPan"

这对于带有硬件键盘的设备有效吗?我在使用硬件键盘设备(即2.2设备)时遇到了困难。 - NinjaCoder
对于像我这样的新手:您必须在 <activity android:name=".MyActivity" 之后立即添加此行。 - LePatay

8
我有两种方法。 方法1. 在OnCreate方法中使用以下代码。
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

它将防止键盘弹出,除非你点击。
或者 方法2 你可以使用xml中的“requestfocus”将焦点移开其他视图,如TextView。
<TextView
            android:id="@+id/year_birth_day"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="1991">            
           <requestFocus />
           </TextView>

方法三(我认为应该避免)在清单文件中使用以下代码-

android:windowSoftInputMode="stateVisible"

2
使用 <requestFocus/> 是唯一对我有效的方法。谢谢。 - jungledev

6
尝试延迟一段时间后再显示键盘。类似于这样的做法:
public void onResume() {
    super.onResume();

    TimerTask tt = new TimerTask() {

        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(yourTextBox, InputMethodManager.SHOW_IMPLICIT);
        }
    };

    final Timer timer = new Timer();
    timer.schedule(tt, 200);
}

2
定时器任务?干什么用的? - busylee
@busylee,你可以使用Handler或任何其他方法来延迟执行某些操作。这只是一个例子。 - whlk
没有理由使用延迟。 - busylee

3

需要重点关注!

android:windowSoftInputMode="stateVisible|adjustPan"仅仅这样设置是无法在活动启动时显示键盘的。

您还需要在类中明确添加此内容。

editTextXYZ.requestFocus()
        val imm: InputMethodManager =
            getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(editTextXYZ, InputMethodManager.SHOW_IMPLICIT)

1

如果您正在使用模拟器,则必须关闭硬键盘,以便显示软键盘。


1
文件名:AndroidManifest.xml
<activity android:name=".MainActivity">

添加以下属性:
android:windowSoftInputMode="stateVisible"

对我来说起作用了。


0

在setContentView之后粘贴此代码

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

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