点击按钮时使EditText失去焦点

25

我在我的活动中有两个EditText字段和一个完成的button。当用户按下按钮时,我希望两个EditText字段都失去焦点(即光标不应显示在任何一个字段上)。 我正在使用以下代码:

final Button saveButton = (Button) findViewById(R.id.saveButton);
    saveButton.setOnClickListener(saveButtonListener);

private OnClickListener saveButtonListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
                Text1.clearFocus();
                Text2.clearFocus();

    }

}
然而,当我按下“完成”按钮时,即使我还没有单击任何EditText,光标也会出现在Text1上。我该如何使EditText字段在单击按钮时失去焦点?
8个回答

33

尝试更改您的代码如下:

private OnClickListener saveButtonListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
                Text1.clearFocus();
                Text2.clearFocus();
                saveButton.requestFocus(); //or any other View
    }

}

因为当视图调用 public void clearFocus () 方法时:

该视图想放弃焦点。如果清除了焦点,则会调用 onFocusChanged (boolean, int, android.graphics.Rect)。

注意: 当视图清除焦点时,框架会尝试将焦点给予从顶部开始的第一个可聚焦视图。 因此,如果此视图是可以获得焦点的从顶部开始的第一个视图,则在所有与清除焦点相关的回调之后,框架将给予此视图焦点。

这意味着您必须在按钮单击事件中将焦点设置到其他视图上,因为在您的布局中 Text1 充当第一个视图。


5
我能找到的最好的方法是
private void listenToButton(){
    someButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            v.requestFocusFromTouch();
            //Proceed with things
        }
    }
}

  1. 创建一个静态引用以引用一个编辑框。
  2. 在 setOnFocusChange 方法中,将静态编辑框设置为获得焦点的编辑框。
  3. 在按钮点击方法中,使用此引用来确定最后一个拥有焦点的控件,即使他们的焦点并不是因为按钮点击而失去的。
- Andre L Torres
这个有效。requestFocus()不行。谢谢! - undefined

5

你可以尝试这段代码,只需将焦点移动到另一个视图即可。

private OnClickListener saveButtonListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        saveButton.requestFocus(); //any other View
    }

}

3
这对我很有效:
注:该句为一般语言表达,无需翻译。
@Override
public void onClick(View v) {

     //To hide soft keyboard          
   InputMethodManager im = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
   im.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

   v.requestFocusFromTouch();

}

2

把这些代码加入按钮的设置中即可实现该功能。

View.OnClickListener listener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        v.requestFocus();
        ......
    }
};
button.setOnClickListener(listener);

对我来说没问题 :)


运行得非常顺畅。 - Parth Anjaria
对我来说它不起作用,它将数字键盘更改为其他奇怪的数字键盘。它只在第一次工作。然后发生奇怪的事情。 - Michał Ziobro

0

Chandler的回答对我有用,但由于可聚焦属性,我必须点击两次按钮:

第一次点击:获得按钮的焦点。

第二次点击:单击按钮。

因此,在他的帮助下,您也可以通过以下方式实现目标(只需单击按钮):

从布局中获取任何视图(可以是父布局或其他文本视图),并在该视图中放置可聚焦属性,例如:

<LinearLayout // In my case its a parent view with LinearLayout, but this can be any other type of view.
    android:id="@+id/linearLayoutParent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusableInTouchMode="true"    <--- Required
>

然后,在您的 OnClickListener 中:

final Button saveButton = (Button) findViewById(R.id.saveButton);
saveButton.setOnClickListener(saveButtonListener);

private OnClickListener saveButtonListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
            Text1.clearFocus();
            Text2.clearFocus();

            findViewById(R.id.linearLayoutParent).requestFocus(); // puts the focus on that focusable view.
    }
}

额外奖励:

如果您失去焦点后还需要隐藏软键盘,请查看thisthis


如果您有新的问题,请通过单击提问按钮来提出。如果它有助于提供上下文,请包含此问题的链接。- 来自审核 - A S M Sayem
不,我只是试图为这个SO问题提供帮助性的答案,没有为自己提出任何要求。我的回答中有哪里不清楚吗? - AbdulMoizHussain

0

您可以在布局中创建一个空的隐藏EditText元素。它的宽度和高度都为0。然后在单击事件中,您可以调用hiddenEditText.requestFocus()方法。


-1

在按钮点击事件中使用以下代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接