我怎么知道EditText何时失去焦点?


162

我需要抓住EditText失去焦点的时间,我搜索了其他问题,但没有找到答案。

我曾经OnFocusChangeListener这样

OnFocusChangeListener foco = new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        // TODO Auto-generated method stub

    }
};

但是,这对我不起作用。

Answers:


342

hasFocus的实现onFocusChangesetOnFocusChangeListener并且有一个布尔参数。如果这是错误的,则您将注意力转移到另一个控件上。

 EditText txtEdit = (EditText) findViewById(R.id.edittxt);

 txtEdit.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
               // code to execute when EditText loses focus
            }
        }
    });

20
+1-但值得注意的是,如果您的编辑文本位于列表视图中,则每次按下键都将导致该框失去焦点。请参阅以下解决方案以跟踪当前关注的框:stackoverflow.com/questions/9527067/…–
bsautner,

我在哪里添加显示的代码?如果按“ onCreate”中的说明进行操作,则应用程序将崩溃
Jona 2014年

@LéonPelletier真相吗?真?用户触摸另一个焦点控件,editText将其丢失。我看不到任何问题。如果通过代码设置焦点,则相同。
令人难以置信的

@Jona您可以将其添加到任何地方,但onCreate()可以工作。如果崩溃,则说明您做错了什么。
令人难以置信的

8

如果您想对这个接口进行分解使用,请使用您的Activity工具OnFocusChangeListener(),例如:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

在你的OnCreate,你可以添加一个监听器,例如:

editTextResearch.setOnFocusChangeListener(this);
editTextMyWords.setOnFocusChangeListener(this);
editTextPhone.setOnFocusChangeListener(this);

然后android studio会提示您从界面中添加方法,接受它...它将类似于:

@Override
public void onFocusChange(View v, boolean hasFocus) {
// todo your code here...
}

并且由于有了分解代码,您只需要这样做:

@Override
public void onFocusChange(View v, boolean hasFocus) {
   if (hasFocus) {
        editTextResearch.setText("");
        editTextMyWords.setText("");
        editTextPhone.setText("");
    }
    if (!hasFocus){
        editTextResearch.setText("BlaBlaBla");
        editTextMyWords.setText(" One Two Tree!");
        editTextPhone.setText("\"your phone here:\"");
    }
}

您在其中编写的任何代码!hasFocus都是针对失去焦点的项目的行为,应该可以解决问题!但是请注意,在这种状态下,焦点的改变可能会覆盖用户的输入!


1
为什么不使用“其他”而不是“hasFocus!”
萨尔曼纳齐尔

当时,我只是想让事情变得很清楚,但是正如我所说的那样,它仍然无法使用...
Cerberus


1

其工作正常

EditText et_mobile= (EditText) findViewById(R.id.edittxt);

et_mobile.setOnFocusChangeListener(new OnFocusChangeListener() {          
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            // code to execute when EditText loses focus
            if (et_mobile.getText().toString().trim().length() == 0) {
                CommonMethod.showAlert("Please enter name", FeedbackSubmtActivity.this);
            }
        }
    }
});



public static void showAlert(String message, Activity context) {

    final AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(message).setCancelable(false)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {

                }
            });
    try {
        builder.show();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

0

使用Java 8 Lambda表达式:

editText.setOnFocusChangeListener((v, hasFocus) -> {
    if(!hasFocus) {
        String value = String.valueOf( editText.getText() );
    }        
});
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.