【问题标题】:Automatic popping up keyboard on start Activity启动 Activity 时自动弹出键盘
【发布时间】:2011-06-07 18:44:39
【问题描述】:

我有一个相对简单的问题。我有一个包含很多 EditText 的活动。当我打开活动时,它会自动聚焦到第一个 EditText 并显示虚拟键盘。

我怎样才能防止这种情况发生?

【问题讨论】:

标签: android keyboard focus android-edittext


【解决方案1】:

在您的 Activity 代码中使用它:

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

【讨论】:

    【解决方案2】:

    search_edit_text = (EditText) findViewById(R.id.search_edit_text);

        search_edit_text.requestFocus();
        search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
    

    这对我有用,伙计们片段可能有一些不同的语法。 这适用于活动

    【讨论】:

    【解决方案3】:

    android:focusableInTouchMode="true"

    将上述行添加到具有焦点的EditTextTextInputLayout 的xml 并导致softInputKeyboard 弹出。

    这为我们解决了问题,现在键盘没有弹出

    【讨论】:

      【解决方案4】:

      将以下代码添加到活动 XML 的顶部,并确保视图位于 EditText 上方

      <View 
      android:layout_width="0dp"
      android:layout_height="0dp"
      android:focusableInTouchMode="true"/>
      

      【讨论】:

        【解决方案5】:

        您可以将其添加到您的 Android Manifest 活动中:

        android:windowSoftInputMode="stateHidden|adjustResize"
        

        【讨论】:

        • 这可行,但是如果您有图像背景并且担心您的软键盘会缩小此类图像背景,请使用android:windowSoftInputMode="stateHidden|adjustPan"
        【解决方案6】:

        android:windowSoftInputMode="stateHidden|adjustResize"

        工作正常

        【讨论】:

          【解决方案7】:

          这在以下帖子中有一些很好的答案:Stop EditText from gaining focus at Activity startup。我经常使用的是Morgan的以下代码:

          <!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
          <LinearLayout
              android:focusable="true" 
              android:focusableInTouchMode="true"
              android:layout_width="0px" 
              android:layout_height="0px"/>
          
          <!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
          to prevent the dummy from receiving focus again -->
          <AutoCompleteTextView android:id="@+id/autotext"
              android:layout_width="fill_parent" 
              android:layout_height="wrap_content"
              android:nextFocusUp="@id/autotext"     
              android:nextFocusLeft="@id/autotext"/>
          

          注意:虚拟项目必须放在可聚焦元素之前。

          而且我认为即使使用 ScrollView 也应该可以完美运行,并且在可访问性方面也没有任何问题。

          【讨论】:

            【解决方案8】:
            ((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
            

            【讨论】:

            • 使用片段..这段代码可以隐藏键盘...当片段打开时避免将焦点放在edittext字段键盘上...
            【解决方案9】:

            接受的答案对我不起作用,这就是为什么给出答案有效的解决方案,可能会有所帮助!

            EditText edt = (EditText) findViewById(R.id.edt);
            edt.requestFocus();    
            edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
            edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
            

            现在键盘打开享受:)

            【讨论】:

            • 问题是如何防止键盘打开。
            【解决方案10】:

            在 XML 文件的布局标签中使用此属性:

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

            正如 cmets 中的其他成员所报告的,它不适用于 ScrollView,因此您需要将这些属性添加到 ScrollView 的主要子元素中。

            【讨论】:

            • 这也解决了我的问题。我将此添加到我的活动的 RelativeLayout 标记中。谢谢!
            • 有趣的是,当我将上述内容添加到 ScrollView 时它不起作用,但它确实适用于 LinearLayout
            • 我认为你必须把它放在最顶层的布局上
            • 所以我想这是可行的,因为你告诉布局本身它可以有焦点?否则它假定它需要将焦点放在表单上的第一个控件上?奇怪的是,即使我的表单上的所有控件都被禁用,我也得到了键盘。现在修好了。谢谢!
            • 请务必注意,此解决方案会产生可访问性问题(不应聚焦的视图被标记为具有焦点)并可能产生意想不到的后果。
            【解决方案11】:

            我找到了适合我的简单解决方案。在您的父布局中设置这些属性:

            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/mainLayout"
            android:descendantFocusability="beforeDescendants"
            android:focusableInTouchMode="true" >
            

            现在,当 Activity 启动时,这个主布局将默认获得焦点。

            此外,我们可以在运行时将焦点从子视图中移除,方法是再次将焦点赋予主布局,如下所示:

            findViewById(R.id.mainLayout).requestFocus();
            

            希望它对你有用。

            【讨论】:

              【解决方案12】:

              当您的 EditText 像您的活动开始时一样自动获得焦点时,就会发生这种情况。因此,解决此问题的一种简单而稳定的方法是将初始焦点设置为任何其他视图,例如按钮等。

              您可以在您的布局 XML 中执行此操作,无需代码..

              【讨论】:

                【解决方案13】:

                https://stackoverflow.com/a/11627976/5217837这几乎是正确的:

                @Override
                public void onCreate(Bundle savedInstanceState) {
                
                getWindow().setSoftInputMode(
                   WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                
                }
                

                但它应该是 SOFT_INPUT_STATE_HIDDEN 而不是 SOFT_INPUT_STATE_ALWAYS_VISIBLE

                【讨论】:

                  【解决方案14】:

                  有趣的是,这个文档https://developer.android.com/training/keyboard-input/visibility.html 指出,当一个活动开始并且焦点被赋予一个文本字段时,软键盘不会显示(然后继续向你展示如何显示键盘,如果你想一些代码)。

                  在我的三星 Galaxy S5 上,这就是我的应用程序(没有清单条目或特定代码)的工作方式——没有软键盘。然而,在 Lollipop AVD 上,显示了一个软键盘——这与上面给出的文档相违背。

                  如果您在 AVD 中进行测试时遇到这种情况,您可能需要在真实设备上进行测试,看看会发生什么。

                  【讨论】:

                    【解决方案15】:

                    我在这里描述了几个实现,但现在我已经为我的AndroidManifest.xml 属性添加了AndroidManifest.xml

                    android:windowSoftInputMode="stateAlwaysHidden"
                    

                    我认为即使您使用的是fragments,这也是一种简单的方法。

                    "stateAlwaysHidden" 软键盘总是隐藏 活动的主窗口具有输入焦点。

                    【讨论】:

                    • 这对我来说适用于 ScrollView 和 RelativeLayout。
                    • 对于片段来说并不是那么好,因为您将“隐藏状态”与将包含所有片段的活动相关联,这意味着您要在活动中显示的任何片段都会受到属性(不是基于“每个片段”)。
                    【解决方案16】:

                    如果您对自己的活动有其他看法,例如 ListView,您也可以这样做:

                    ListView.requestFocus(); 
                    

                    在您的 onResume() 中从 editText 获取焦点。

                    我知道这个问题已经得到解答,但只是提供了一个对我有用的替代解决方案:)

                    【讨论】:

                      【解决方案17】:

                      这是我正在使用的解决方案,不是最好的解决方案,但对我来说效果很好

                       editComment.setFocusableInTouchMode(false);
                       editComment.setOnTouchListener(new OnTouchListener(){
                      
                                      @Override
                                      public boolean onTouch(View v, MotionEvent event)
                                      {
                                          // TODO Auto-generated method stub
                                          editComment.setFocusableInTouchMode(true);
                                           editComment.requestFocus() ;
                                          return false;
                                      }});
                      

                      【讨论】:

                        【解决方案18】:

                        我遇到了一个类似的问题,即使在切换选项卡时,键盘也会自动弹出并保持不变,平板电脑上使用的是 Android 3.2.1。使用以下方法:

                        public void setEditTextFocus(EditText searchEditText, boolean isFocused)
                        {
                            searchEditText.setCursorVisible(isFocused);
                            searchEditText.setFocusable(isFocused);
                            searchEditText.setFocusableInTouchMode(isFocused);
                            if (isFocused) {
                                searchEditText.requestFocus();
                            } else {
                                InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
                                inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
                            }
                        }   
                        

                        在每个 EditText 的活动的 onCreate() 和 onPause() 中:

                        setEditTextFocus(myEditText, false);

                        对于每个 EditText 一个 OnTouchListener:

                            myEditText.setOnTouchListener(new EditText.OnTouchListener() {
                                @Override
                                public boolean onTouch(View v, MotionEvent event) {
                                    setEditTextFocus(myEditText, true); 
                                    return false;
                                }
                            });
                        

                        对于OnEditorActionListener 中的每个EditText

                            myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
                                @Override
                                public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
                                                    .......
                                    setEditTextFocus(myEditText, false); 
                                    return false;
                                }
                            });
                        

                        对于layout xml 中的每个EditText

                                    android:imeOptions="actionDone"
                                    android:inputType="numberDecimal|numberSigned" // Or something else
                        

                        可能还有更多的代码优化可能。

                        【讨论】:

                          【解决方案19】:

                          在您的 Activity 代码中使用它:

                          @Override
                          public void onCreate(Bundle savedInstanceState) {
                          
                          getWindow().setSoftInputMode(
                             WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                          
                          }
                          

                          【讨论】:

                          【解决方案20】:

                          如果您的视图具有 EditText 和 Listview,则默认情况下会打开键盘。 要在默认情况下隐藏键盘弹出,请执行以下操作

                          this.listView.requestFocus();
                          

                          确保在获得 editText 视图后请求关注列表视图。

                          例如

                          this.listView = (ListView) this.findViewById(R.id.list);
                          this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
                          this.listView.requestFocus();
                          

                          如果你这样做,那么editText将获得焦点并弹出键盘。

                          【讨论】:

                          • 我这样做了,但他们的键盘仍然弹出,焦点在 editText。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-06-15
                          • 1970-01-01
                          • 2011-01-30
                          • 1970-01-01
                          相关资源
                          最近更新 更多