【问题标题】:Android on-screen keyboard auto popping upAndroid屏幕键盘自动弹出
【发布时间】:2011-01-30 14:43:23
【问题描述】:

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

这是 1.5 中的错误吗?有什么我可以做的吗?

【问题讨论】:

  • 如果它是一个错误,它可能专门在 Sprint Hero 中。 Sprint 在他们出售的 Heros 上有一个错误的 Android 版本,他们似乎并不急于推出错误修复。 Sprint Heros 和所有其他 Android 设备之间的行为存在大量差异。据我所知,其他版本的英雄,例如欧洲的版本,没有这些问题。
  • 不幸的是,英雄在欧洲确实存在重大问题,它们会根据内部版本号而变化,但我们遇到了 3 - 4 个重大错误。

标签: android android-softkeyboard


【解决方案1】:

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

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

【讨论】:

  • 这对我不起作用(2.2 MyTouch 3G)。在我的 onCreate() 方法中,我调用了 setSoftInputMode()。 EditText 仍然会导致键盘显示:(
  • 这对我有用。我正在运行 Android 2.3.4,并使用 进行开发
  • 或者像here一样使用android:windowSoftInputMode="stateHidden"
  • 所以让我感到困惑的是,我有一个登录活动似乎已经很好地隐藏了键盘。我现在也进行了注册活动,但默认情况下会弹出键盘。那么登录如何避免这种情况呢?我在登录活动中找不到 setSoftInputMode,或者在 activity.xml 中找不到 windowSoftInputMode 属性。
  • 并不总是有效:在某些设备上,SOFT_INPUT_STATE_ALWAYS_HIDDEN 会导致错误,即活动中不是最后一个的编辑文本无法导致软键盘出现。在清单中使用 "android:windowSoftInputMode="stateHidden"" 也具有相同的效果。开发者文档指出,除非强制,否则软键盘不会自动出现,但这是完全错误的。
【解决方案2】:
<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)

将“windowSoftInputMode="stateHidden"' 放置在应用程序的清单 XML 文件中,以显示您希望软件键盘保持隐藏状态的每个活动。这意味着键盘不会自动出现,用户必须“单击” ' 在文本字段上显示它。我搜索了将近一个小时的东西,所以我想我会分享。

【讨论】:

  • 迄今为止我找到的最佳解决方案。在不打开键盘的情况下聚焦字段。适用于 Nexus S 4.1.2
  • android:windowSoftInputMode="stateHidden|adjustNothing" 如果您正在使用片段并且您不希望键盘更改布局也很有帮助
【解决方案3】:

将此添加到您的 AndroidManifest.xml 中:

android:windowSoftInputMode="stateHidden|adjustResize"

完美运行。 :)

【讨论】:

  • 感谢您的回答。对不起,我现在怎么叫键盘?调用requestFocus()时不会出现。
【解决方案4】:

此代码适用于所有 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 用于区分哪些弹出,哪些不弹出
【解决方案5】:

将此添加到 XML 的父布局中。

android:focusable="true" 
android:focusableInTouchMode="true"

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

【讨论】:

    【解决方案6】:

    您可以在活动的 onCreate() 方法中使用它

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

    或将此代码粘贴到 AndroidManifest.xml 中的 Activity 标记中

    android:windowSoftInputMode="stateVisible"
    

    【讨论】:

    • 我认为您的意思是“stateHidden”而不是“stateVisible”。
    【解决方案7】:

    在该版本的 Android 中,当视图膨胀时,焦点将默认设置为第一个可聚焦控件 - 如果没有物理键盘,则会弹出屏幕键盘。

    要解决此问题,请在其他位置显式设置焦点。如果焦点设置为 EditText 以外的任何内容,则不会出现屏幕键盘。

    您是否尝试过在模拟器中运行 Android 1.5 进行测试?

    【讨论】:

    • 我已经在模拟器中尝试过(只是再次尝试以确保我没有发疯)。它的行为“正确”(意味着没有键盘弹出)。另外,当我最初写这篇文章时,我的 G1 运行的是 1.5,但它并没有以这种方式运行(当他们的键盘“隐藏”时)。
    • 我仍然打赌这与最初的焦点有关。也许这是 HTC Hero 特有的问题,但我会尝试将焦点明确设置为其他内容,看看是否能为您的用户解决问题。
    • 有什么方法可以让“无”的焦点?
    • 这对我不起作用(2.2 MyTouch 3G)。在我的 onCreate() 方法中,我在 Button 上显式调用 requestFocus(),这是视图中的第二个小部件。 EditText 仍然会导致键盘显示:(
    【解决方案8】:

    可以在Android Mainfest.xml的activity标签下添加一行代码

     <activity
            android:name="com.sams.MainActivity"
            android:windowSoftInputMode="stateVisible" >
     </activity>
    

    这可能对你有帮助。

    【讨论】:

      【解决方案9】:

      您可以像这样以编程方式进行操作

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

      或在&lt;activity tag 中设置android:windowSoftInputMode="stateHidden" AndroidManifest.xml

      【讨论】:

        【解决方案10】:

        在最重要的地方加入这个:

        import android.view.WindowManager;
        

        在 OnCreate 部分添加此代码:

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

        【讨论】:

          【解决方案11】:
          InputMethodManager imm = (InputMethodManager)GetSystemService(Context.InputMethodService);
                  imm.ShowSoftInput(_enterPin.FindFocus(), 0);
          

          *这适用于 Android.xamarin 和 FindFocus()-它在层次结构中搜索基于当前具有焦点的视图的视图,因为我在上述代码之前有 _enterPin.RequestFocus(),因此它显示了 _enterPin EditText 的键盘*

          【讨论】:

            【解决方案12】:

            如果你使用fragment,你需要在onResume和onCreate中每次都调用hideKeyboard才能隐藏键盘。

                @Override
                public void onResume() {
                    super.onResume();
                    Log.d(TAG, "SectionMyFragment onResume");
                    hideKeyboard();
                }
            
            private void hideKeyboard() {
                if (getActivity() != null) {
                    InputMethodManager inputMethodManager = (InputMethodManager)
                            getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            
                    if (inputMethodManager != null) {
                        if (getActivity().getCurrentFocus() != null) {
                            Log.d(TAG, "hideSoftInputFromWindow 1");
                            inputMethodManager.hideSoftInputFromWindow((getActivity().getCurrentFocus()).getWindowToken(), 0);
                        }
                    }
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-02-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-06-06
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多