启动活动时自动弹出键盘


97

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

我该如何预防?


检查我对这个问题的回答stackoverflow.com/questions/39593324/...
Android说明

当“我的应用”启动(打开)并且如果“编辑文本”视图可用时,则启用键盘“自动”(显示)。如何独此问题请点击这里easycomacademy.com/...
阿玛杜拉·艾哈迈德

Answers:


209

在XML文件的布局标记中使用以下属性:

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

正如其他成员在评论中所报告的那样,该功能无效,ScrollView因此您需要将这些属性添加到的主要子级中ScrollView


3
这也解决了我的问题。我将此添加到了我的活动的RelativeLayout标记中。谢谢!
路加福音

21
有趣的是,当我将以上内容添加到ScrollView时,它不起作用,但对LinearLayout却起作用了
Jerry Brady

1
我认为您必须将其放在最顶层的布局上
Utsav Gupta 2014年

所以我猜这行得通,因为您是在告诉布局本身可以具有焦点?否则,它假定需要将重点放在表单上的第一个控件上?奇怪的是,即使禁用了窗体上的所有控件,我也正在获得键盘。立即修复。谢谢!
crowmagnumb 2014年

1
重要的是要注意,此解决方案会导致可访问性问题(该视图不应聚焦于标记为具有焦点的视图),并且可能会产生意想不到的后果。
雷纳托

96

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

android:windowSoftInputMode="stateHidden|adjustResize"

这行得通,但是,如果您有图像背景,并且担心软键盘会缩小此类图像背景,请使用android:windowSoftInputMode="stateHidden|adjustPan"
ArtiomLK

31

我在这里描述了几种实现,但是现在我已经AndroidManifest.xmlActivity属性添加了:

android:windowSoftInputMode="stateAlwaysHidden"

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

stateAlwaysHidden ”当活动的主窗口具有输入焦点时,软键盘始终处于隐藏状态。


这对我来说既可以使用ScrollView也可以使用RelativeLayout。
iversoncru 2015年

对于片段来说并不是那么好,因为您将“隐藏状态”与将包含所有片段的活动相关联,这意味着您要在活动中显示的任何片段都将受到属性的影响(而不是针对“每个片段” ”)。
Pelpotronic

11

如果您对自己的活动有另一种看法,例如ListView,也可以执行以下操作:

ListView.requestFocus(); 

在您的onResume()中抓住焦点editText

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




3

我遇到了类似的问题,即使在平板电脑上使用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;
        }
    });

对于每一个EditTextOnEditorActionListener

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

而对于每一个EditTextlayout xml

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

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


3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);

使用片段..这段代码可以隐藏键盘...当片段打开时,避免将注意力集中在edittext字段键盘上...
Sreelal S 17-4-28

2

我找到了一个适用于我的简单解决方案,请在您的父布局中设置以下属性:

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

现在,当活动开始时,默认情况下,此主布局将获得焦点。

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

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

希望它对你有用。


1

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

 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;
                }});

1

有趣的是,该文档https://developer.android.com/training/keyboard-input/visibility.html指出,当活动开始并将焦点放在文本字段上时,软键盘不会显示(然后继续显示)。告诉您如何显示键盘(如果您想输入一些代码)。

在我的Samsung Galaxy S5上,这就是我的应用程序(无清单输入或特定代码)的工作方式-无软键盘。但是,在Lollipop AVD上显示了软键盘-违反了上面给出的文档。

如果在AVD中进行测试时出现此问题,则可能需要在真实设备上进行测试以查看会发生什么。


1

在以下文章中,这提供了一些很好的答案:阻止EditText在Activity启动时获得关注。我经常使用的是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,它也应该可以完美工作,并且在可访问性方面也没有任何问题。


0

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

您可以在布局XML中执行此操作,不需要任何代码。


0

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

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));

现在键盘已打开享受:)


问题是如何防止键盘打开。
jk7


0

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

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


0

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));

这对我来说很有效片段可能具有一些不同的语法。此活动的工作


您需要在答案中提供任何限制,假设或简化。在此链接上查看有关如何回答的更多详细信息:stackoverflow.com/help/how-to-answer
Usama Abdulrehman

-1

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

this.listView.requestFocus();

确保在获取editText的视图后请求将焦点集中在listview上。

例如

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

如果这样做,则editText将获得焦点,并且键盘将弹出。


我这样做了,但是它们的键盘仍然弹出,并且焦点在editText上。
David Doria 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.