禁用自动聚焦于编辑文本


74

我有一个编辑文本:

   <LinearLayout android:id="@+id/linearLayout7" android:layout_width="match_parent" android:layout_height="wrap_content">
        <EditText android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_weight="1" android:id="@+id/editText1" android:text="3">
            <requestFocus></requestFocus>
        </EditText>
        <Button android:text="Button" android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/button2"></Button>
    </LinearLayout>

然后下面还有其他东西

我遇到的问题是,当应用程序启动时就将焦点放在输入上,我不希望在应用程序启动时就将焦点放在输入上。

我尝试删除

<requestFocus></requestFocus>

事情,它什么也没做。


设置android:focusable =“ false”。它不会专注于您的EditText
Nishant Shah

2
那将永远变得难以置信?现在,即使我单击文本字段也不会聚焦。我想在单击时集中注意力,只是在应用启动时不自动聚焦
Saad

1
你可以先在代码中获得的按钮,并将焦点ID按钮开始....
Hanry

1
我做到了:a_button =(Button)findViewById(R.id.a_button); a_button.requestFocus(); 在代码刚开始时,但它什么也没做。我可以通过xml设置焦点吗?
萨德

4
添加android:focusableInTouchMode="true"我的父母布局对我来说很有效。
Marcelo Gracietti

Answers:


164

EditText的父布局中添加android:focusable="true"android:focusableInTouchMode="true"元素,如下所示;

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout7" android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:focusable="true" android:focusableInTouchMode="true">

我认为,它将为您提供帮助。

也可以看看;
    Android Developers处理触摸和输入的官方指南


2
@Saad:有效。在将其发布到这里之前,我已经对其进行了测试。将元素保留在XML文件的顶部。顺便说一句,您正在开发哪个API级别(或Android版本)?
Mudassir

1
好。您能解释一下android:focusable和android:focusableInTouchMode用于什么(我的意思是区别和用法)。
Anoop

4
如果它不起作用,也将其添加到父项: android:descendantFocusability="beforeDescendants"
A. Rager

它有效,但是当我单击edittext时,键盘不会弹出!
reverie_ss

@reverie_ss,您是对的,我也遇到同样的问题。
Ahesanali Suthar'July

14

如果您想清除默认的编辑文本焦点,请使用以下2个属性

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

在父级线性布局中。

例如:

<LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:focusable="false"
            android:focusableInTouchMode="true"
            android:orientation="vertical">


     <EditText
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:hint="email id"
         android:inputType="textEmailAddress"
         android:maxLines="1"
    />

</LinearLayout>

如果要在创建活动时隐藏键盘,请在清单文件活动标记中使用以下属性,例如:

 <activity
     android:configChanges="screenSize|orientation|keyboardHidden"
     android:screenOrientation="portrait"
     android:name=".activities.LoginActivity"
     android:windowSoftInputMode="stateHidden|adjustResize"/>

如果要在单击按钮或发生某些事件时隐藏键盘,请使用以下代码

 public void onClick(View v) {
                try {
                    //InputMethodManager is used to hide the virtual keyboard from the user after finishing the user input
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    if (imm.isAcceptingText()) {
                        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
                    }
                } catch (NullPointerException e) {
                    Log.e("Exception", e.getMessage() + ">>");
                }
                    }
                } catch (NullPointerException e) {
                    Log.e("Exception", e.getMessage() + ">>");
                }

如果要在离开活动后从编辑文本字段中移出焦点

@Override
    protected void onResume() {
        super.onResume();
        mEmail.clearFocus();
        mPassword.clearFocus();
}

最后,如果要在提交表单时清除编辑文本字段中的数据,请使用

 @Override
    protected void onResume() {
        super.onResume();
        mEmail.getText().clear();
        mPassword.getText().clear();
    }

9

没有更多的工作...只需将android:windowSoftInputMode =“ stateAlwaysHidden”添加到Manifest.xml文件的活动标记中。


2
请说明这是做什么的,以及它可能如何帮助OP。即使解决方案可行,没有解释的建议也无济于事。
SuperBiasedMan

请参考以上链接。
Nishanth S Babu

4
这将隐藏键盘,但是如果我没记错的话,EditText仍然保持焦点。
A. Rager

1
API 27提及的所有方法均无效!
Maksim Kniazev

7
<LinearLayout 
    android:focusable="true"
    android:focusableInTouchMode="true" 
    android:layout_width="0px"
    android:layout_height="0px" />

 <EditText android:text="" 
    android:id="@+id/EditText01"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:hint="@string/hint">
 </EditText>

无需其他编码,这是一个简单明了的解决方案。


2

您可以使用隐藏的窗口软输入模式隐藏键盘android:focusable="false"android:focusableInTouchMode="true"

<activity
    android:name=".MainActivity"
    android:windowSoftInputMode="stateHidden"
    android:label="@string/app_name"
    >

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

2

在LinearLayout中尝试此代码

 <LinearLayout
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <EditText

            android:hint="Search..."
            android:drawableRight="@drawable/ic_search"
            android:id="@+id/search_tab_hotbird_F"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyHotbird_F"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="4dp">

        </android.support.v7.widget.RecyclerView>

    </LinearLayout>

2

它对我有用,希望也能对您有所帮助。

要么:

android:windowSoftInputMode="stateAlwaysHidden"

将此属性添加到要禁用自动对焦的特定活动下的Manifest.xml文件中。 缺点:它只会隐藏您的软键盘,光标将仍然在那里。

其他:

 android:focusableInTouchMode="true"

将此属性添加到您的UI xml文件中(在父级布局下),以便同时隐藏焦点和键盘。


1
<EditText
        android:id="@+id/input"
        android:layout_width="0dp"
        android:layout_height="48dp"
        android:focusable="false"
        android:focusableInTouchMode="false" />

detailInputView = (EditText) debugToolsView.findViewById(R.id.input);
    detailInputView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            detailInputView.setFocusable(true);
            detailInputView.setFocusableInTouchMode(true);
            return false;
        }
    });

但这也无助于从编辑文本字段获取焦点,它只是改变了设备上元素加载的方式,尽管它可以工作
HSL

0

只需将以下内容添加到您的主布局视图xml标记中:

 android:focusableInTouchMode="true"

0

有几种方法可以做到,Mudassir已为您提供了一种方法。

如果这个想法行不通,那就做简单的事情-

在您的AndroidManifest>Activity代码中添加以下简单代码:

android:windowSoftInputMode="stateHidden"

无需在XML的EditText中进行任何操作,所有操作都将起作用,并且不会出现焦点。

看一下现实生活中的示例代码:

<activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden"
        android:label="@string/app_name"
        >

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>

0

对于清晰的默认requestFocuse,您应该像下面这样设置View的父级focusable =“ true”

<android.support.constraint.ConstraintLayout
                android:id="@+id/coordinatorChild"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:focusable="true"
                android:focusableInTouchMode="true">

0

在显示父视图之前,我先进行了此操作(并且工作正常),即使我触摸它,编辑文本也不会自动聚焦。(parentView包含编辑文本)

... 
parentView.setFocusable(true);
parentView.setFocusableInTouchMode(true);
objProperties.setVisibility(VISIBLE);
...
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.