安卓屏幕键盘自动弹出问题

144

我的一个应用程序有一个“开机画面”(基本上是一个菜单),其中包括一个EditText和几个Button。问题是,我有几个用户报告说当他们打开应用程序时,屏幕上的键盘会自动弹出,而他们甚至没有触摸到EditText。据我所知,所有这些用户都在使用HTC Hero

这是 1.5 版本中的一个 bug 吗?我能做什么来解决它吗?


1
如果是一个错误,那么很可能是在Sprint Hero上特别存在的。Sprint在销售的Heros上有一个有缺陷的Android版本,他们似乎并没有急于推出针对它的错误修复。Sprint Heros和所有其他Android设备之间的行为差异非常多。据我所知,欧洲等其他版本的Hero没有这些问题。 - Mark B
不幸的是,欧洲的英雄机存在重大问题,这些问题会因版本号的更改而变化,但我们已经遇到了3-4个重大错误。 - Donal Rafferty
12个回答

290

您可以在活动的onCreate方法中使用以下代码行,以确保键盘仅在用户单击EditText时弹出

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

这对我不起作用(2.2 MyTouch 3G)。在我的onCreate()方法中,我调用setSoftInputMode()。EditText仍然会导致键盘显示:( - Nate
这对我有用。我正在运行Android 2.3.4,并使用<uses-sdk android:minSdkVersion="3" />进行开发。 - Sandy
83
或者使用 android:windowSoftInputMode="stateHidden",像这里一样。 - Swato
所以让我困惑的是,我有一个登录活动,似乎已经很好地隐藏了键盘。现在我也制作了一个注册活动,但默认情况下键盘会弹出。那么登录活动是如何避免这种情况的呢?我找不到登录活动中的setSoftInputMode,或者activity.xml中的windowSoftInputMode属性。 - Chucky
并不总是有效:在某些设备上,SOFT_INPUT_STATE_ALWAYS_HIDDEN会导致错误,即活动中不是最后一个的编辑文本不能引起软键盘出现。在清单中使用“android:windowSoftInputMode =”stateHidden“”也具有相同的效果。开发人员文档说明软键盘不会自动出现,除非强制出现,但这是完全错误的。 - user3467994
这帮助我解决了程序中最烦人的错误,即每次进入我设置的搜索服务活动时键盘都会弹出。你知道这个信息来自哪里吗?我很好奇。 - Joshua Michael Calafell

87
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Main"
              android:label="@string/app_name"
              android:windowSoftInputMode="stateHidden"
              >

这适用于Android 3.0、3.1、3.2、4.0 - 编辑器使用的是Eclipse 3.7。

在每个您希望软键盘保持隐藏的活动中,在应用程序清单XML文件中放置 'windowSoftInputMode="stateHidden"'。这意味着键盘不会自动弹出,用户必须“点击”文本字段才能弹出它。我搜索了将近一个小时寻找可行的方法,所以我想分享一下。


到目前为止,我找到的最佳解决方案。可以在不打开键盘的情况下聚焦于字段。在搭载4.1.2的Nexus S上运行。 - alexismorin
2
android:windowSoftInputMode="stateHidden|adjustNothing",如果你在使用片段(fragments)且不希望键盘改变布局,这也是非常有帮助的。 - whyoz

6
将以下内容添加到您的 AndroidManifest.xml 文件中:
android:windowSoftInputMode="stateHidden|adjustResize"

它完美地工作。:)


1
谢谢您的回答。很抱歉,我现在怎么调用键盘?当调用 requestFocus() 时它不会弹出。 - Takeshi Tokugawa YD

6

这段代码适用于所有 Android 版本:

@Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_login);

 //Automatic popping up keyboard on start Activity

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

 or

 //avoid automatically appear android keyboard when activity start
     getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
 }

加1分,告诉我们哪个弹出窗口,哪个没有弹出。 - Demon App Programmer

6
请将以下代码添加到XML的父布局中。
android:focusable="true" 
android:focusableInTouchMode="true"

它确保在 Activity 启动时,焦点不会在 editText 上。

3
您可以在activity的onCreate()方法中使用此代码。
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

或者将此代码粘贴到 AndroidManifest.xml 中的 Activity 标签中。
android:windowSoftInputMode="stateVisible"

2
我认为你的意思是“stateHidden”,而不是“stateVisible”。 - stevehs17

2
您可以在activity标签下添加一行代码,具体位置是在Android Mainfest.xml中。
 <activity
        android:name="com.sams.MainActivity"
        android:windowSoftInputMode="stateVisible" >
 </activity>

这可能对你有所帮助。


2
在该版本的Android中,当视图被膨胀时,默认情况下焦点将设置为第一个可聚焦的控件 - 如果没有物理键盘,则屏幕键盘将弹出。
要解决此问题,请明确地将焦点设置在其他位置。如果将焦点设置为EditText之外的任何内容,则屏幕键盘将不会出现。
您是否尝试通过在模拟器中运行Android 1.5进行测试?

我已经在模拟器中尝试过了(并且再次尝试以确保我没有疯狂)。它的表现是“正确的”(这意味着没有键盘弹出)。此外,当我最初编写此代码时,我的G1正在运行1.5版本,并且当键盘被“隐藏”时它并未表现出这种方式。 - Jeremy Logan
我仍然认为这与初始焦点有关。也许这是HTC Hero特有的问题,但我建议尝试将焦点明确设置为其他内容,看看是否可以解决用户的问题。 - Mark B
有没有办法将“无”设置为焦点? - Jeremy Logan
1
这对我不起作用(2.2 MyTouch 3G)。在我的onCreate()方法中,我明确调用了一个Button上的requestFocus(),它是视图中第二个小部件。但EditText仍然会导致键盘显示:( - Nate

1
在导入部分的顶部包含以下内容:
import android.view.WindowManager;

在OnCreate部分添加以下代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ....
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
}

1
你可以通过编程来实现,例如:

你可以像这样进行编程:

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editTextField.getWindowToken(), 0);

或者在AndroidManifest.xml中的标签内设置android:windowSoftInputMode="stateHidden"。

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