Android:强制EditText删除焦点?

Android: Force EditText to remove focus?

本问题已经有最佳答案,请猛点这里访问。

我希望能够从EditText中删除焦点。 例如,如果键盘出现,并且用户使用后退按钮隐藏它,我希望焦点和光标消失。 怎么做到呢?


你可以使光标和焦点消失

1
edittext.clearFocus();

但是检测键盘隐藏是一项艰苦的工作。


您可以将其添加到onCreate,每次激活时它都会隐藏键盘。

您还可以以编程方式将焦点更改为另一个项目。

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


在XML中的EditText之前添加LinearLayout

1
2
3
4
5
6
<LinearLayout
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:clickable="true"
    android:layout_width="0px"
    android:layout_height="0px" />

或者你可以通过在"EditText"之前添加这些行来查看相同的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<Button
    android:id="@+id/btnSearch"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:gravity="center"
    android:text="Quick Search"
    android:textColor="#fff"
    android:textSize="13sp"
    android:textStyle="bold" />

<EditText
    android:id="@+id/edtSearch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="5dp"
    android:gravity="left"
    android:hint="Name"
    android:maxLines="1"
    android:singleLine="true"
    android:textColorHint="@color/blue"
    android:textSize="13sp"
    android:textStyle="bold" />


删除焦点但仍保持专注:

1
2
3
4
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);

EditText将失去焦点,但可以在新的触摸事件中再次获得它。


删除autofocus edittext android

它对我有用

编辑在他们建议使用LinearLayout的链接中,但简单的View将起作用

1
2
3
4
5
6
<View
    android:id="@+id/focus_thief"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:focusable="true"
    android:focusableInTouchMode="true" />

然后,如果这个"小偷"被放置在布局的顶部(成为第一个可聚焦的项目),则对clearFocus()的调用将起作用。


将这两个属性添加到父布局(例如:线性布局,相对布局)

1
2
android:focusable="true"
android:focusableInTouchMode="true"

它会做的伎俩:)


您还可以在清单操作部分中包含android:windowSoftInputMode ="stateAlwaysHidden"。

这相当于:

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

但是以XML方式。

仅供参考,您还可以使用以下代码隐藏键盘:

1
2
3
// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);


尝试在你的视图中使用这个
它对我有用:

1
2
3
4
5
6
<View
    android:id="@+id/fucused"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true"/>


你必须删除

如果你不使用它仍然是同样的问题

user LinearLayout作为父级并设置

1
2
android:focusable="true"
android:focusableInTouchMode="true"

希望它对你有所帮助。


添加到您的父布局,您将EditTextandroid:focusableInTouchMode="true"放在哪里


要在活动开始时隐藏键盘,请在onCreate()中编写以下代码。

1
2
3
InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);

清除焦点并从编辑文本中删除光标.....

1
2
3
editText.clearFocus();

editText.setCursorVisible(false);


这是我在SO上的第一个答案,所以如果有错误的话,不要太苛刻。 :d

在SO周围几乎没有答案,但我觉得发布我的完整解决方案的冲动导致我疯了。我已经抓住了周围的点点滴滴,请原谅我,如果我不给每个人各自的信用...... :)

(我会简化我的结果,因为我的观点有太多的元素,我不想用它来垃圾邮件,并会尽量使它尽可能通用......)

对于您的布局,您需要一个父您的EditText和父视图定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:id="@+id/lytContainer"
              android:descendantFocusability="beforeDescendants"
              android:focusableInTouchMode="true">
<EditText android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:id="@+id/etEditor"
              android:inputType="number"
              android:layout_gravity="center"
              android:hint="@string/enter_your_text"
              android:textColor="@android:color/darker_gray"
              android:textSize="12dp"
              android:textAlignment="center"
              android:gravity="center"
              android:clickable="true"/>
</LinearLayout>

所以,我在这里需要一些东西。我需要为我的EditText设置占位符 - 这就是 -

android:hint="hint"

也,

1
2
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

使EditText不会专注于进入Activity,以及稍后在Activity中设置它时,这个设置有助于你可以在其上设置onTouchListener来从EditText中窃取焦点。

现在,在活动中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.at.keyboardhide;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;

public class MainActivity extends Activity implements OnTouchListener{
private EditText getEditText;
private LinearLayout getLinearLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    setContentView(R.layout.keyboardmain);
    getEditText = (EditText)findViewById(R.id.etEditor);
    getLinearLayout = (LinearLayout)findViewById(R.id.lytContainer);
    getLinearLayout.setOnTouchListener(this);

    getEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                Log.d("EDTA","text was entered.");
                getEditText.clearFocus();
                imm.hideSoftInputFromWindow(barcodeNo.getWindowToken(), 0);
                return true;
            }
            return false;
        }
    });
}
@Override
public boolean onTouch(View v, MotionEvent event) {
    if(v==getLinearLayout){
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getEditText.getWindowToken(), 0);
        getEditText.clearFocus();
        return true;
        }
    return false;
    }
}

我在这个问题页面上找到的小部分答案很少,以及我在此博客上找到的活动解决方案的部分。其余的我错过了我必须弄清楚自己正在清除焦点在EditText上,我在setOnEditorActionListener和onTouchLister中添加了父视图。

希望这有助于某人并节省他们的时间。 :)

干杯,
Z.


在评论中,您询问是否可以关注另一个视图而不是EditText。是的,它可以。对于要在开头聚焦的视图使用.requestFocus()方法(在onCreate()方法中)

同时关注其他视图将削减一些代码。 (例如隐藏键盘的代码)


我有同样的问题。这让我更疯狂。

我有一个带有ScrollView的扩展Dialog,它有一个带有扩展LinearLayout的TableLayout,其中包含一个SeekBar和一个EditText。

显示对话框后,第一个EditText始终自动对焦,在键盘上完成文本编辑后,EditText仍然具有焦点,键盘仍然可见。

我尝试了几乎所有这个线程的解决方案,没有一个对我有用。

所以这里我的简单解决方案:(text = EditText)

1
2
3
4
5
6
7
8
9
10
11
12
text.setOnEditorActionListener( new OnEditorActionListener( ){
    public boolean onEditorAction( TextView v, int actionId, KeyEvent event ){
        if( (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) ||
            (actionId == EditorInfo.IME_ACTION_DONE) ){
            text.clearFocus( );
            InputMethodManager iMgr = null;
            iMgr = (InputMethodManager)mContext.getSystemService( Context.INPUT_METHOD_SERVICE );
            iMgr.hideSoftInputFromWindow( text.getWindowToken(), 0 );
        }
        return true;
    }
});

顺便说一下,我没有使用以下任何代码片段来解决它:

1
2
3
//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )

我没有使用像宽度和高度为1dp的视图的间隔项。

希望它可以帮助某人:D


您还可以在清单操作部分中包含android:windowSoftInputMode="stateAlwaysHidden"

这相当于:

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

1
editText.setFocusableInTouchMode(true)

当用户触摸时,EditText将能够获得焦点。
当主要布局(活动,对话框等)变得可见时,即使它是布局中的第一个视图,EditText也不会自动获得焦点。


1
2
3
4
5
6
7
8
9
10
11
12
EditText.setOnKeyListener(new OnKeyListener() {
            public boolean onKey(View view, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_ENTER) {
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(URLText.getWindowToken(), 0);
                    EditText.setFocusable(false);
                    EditText.setFocusableInTouchMode(true);
                    return true;
                } else {
                    return false;
                }
            }
        });

通过设置父元素的属性android:descendantFocusability,可以避免对元素的任何关注。

这是一个例子:

1
2
3
4
5
6
7
8
9
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/search__scroller"
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true">
</ScrollView>

这里,设置为"blocksDescendants"的属性android:descendantFocusability阻止了对子元素的关注。

你可以在这里找到更多信息。


1
2
3
4
5
6
7
8
9
10
11
12
check your xml file
 <EditText
            android:id="@+id/editText1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="14sp">

            **<requestFocus />**
 </EditText>


//Remove  **<requestFocus />** from xml