Làm thế nào tôi có thể biết khi một EditText mất tập trung?


162

Tôi cần nắm bắt khi EditTextmất tập trung, tôi đã tìm kiếm các câu hỏi khác nhưng tôi không tìm thấy câu trả lời.

Tôi đã sử dụng OnFocusChangeListenernhư thế này

OnFocusChangeListener foco = new OnFocusChangeListener() {

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

    }
};

Nhưng, nó không làm việc cho tôi.

Câu trả lời:


342

Thực hiện onFocusChangecủa setOnFocusChangeListenervà có một tham số boolean cho hasFocus. Khi điều này là sai, bạn đã mất tập trung vào một điều khiển khác.

 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 - nhưng đáng chú ý là nếu văn bản chỉnh sửa của bạn nằm trong chế độ xem danh sách, mọi phím xuống sẽ dẫn đến việc mất hộp và lấy nét. Xem giải pháp này để theo dõi hộp hiện đang tập trung: stackoverflow.com/questions/9527067/iêu
bsautner

Tôi thêm mã bạn hiển thị ở đâu? Nếu tôi đặt nó như trong "onCreate" thì ứng dụng gặp sự cố
Jona

@ Léon Pelletier Sự thật? Có thật không? Người dùng chạm vào một điều khiển có thể tập trung khác và editText mất nó. Tôi không thể thấy bất kỳ vấn đề. Sẽ giống nhau nếu bạn đặt tiêu điểm theo mã của mình.
Ngày

@Jona Bạn có thể thêm nó ở bất cứ đâu nhưng onCreate () hoạt động. Nếu nó gặp sự cố, bạn làm điều gì đó sai.
Ngày

8

Yêu cầu bạn Activitythực hiện OnFocusChangeListener()nếu bạn muốn sử dụng giao diện này theo yếu tố:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

Trong của OnCreatebạn, bạn có thể thêm một người nghe ví dụ:

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

sau đó android studio sẽ nhắc bạn thêm phương thức từ giao diện, chấp nhận nó ... nó sẽ giống như:

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

và khi bạn đã có một mã được nhân tố hóa, bạn sẽ phải làm điều đó:

@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:\"");
    }
}

bất cứ điều gì bạn viết mã !hasFocuslà dành cho hành vi của mục bị mất trọng tâm, điều đó sẽ làm nên mánh khóe! Nhưng hãy cẩn thận khi ở trạng thái như vậy, sự thay đổi trọng tâm có thể ghi đè lên các mục của người dùng!


1
tại sao không chỉ sử dụng 'other' thay vì '! hasF Focus'
Salman Nazir

Vào lúc đó, tôi chỉ muốn làm cho mọi thứ thật rõ ràng, nhưng như tôi đã nói nó không thể sử dụng được vì dù sao đi nữa ...
Cerberus

7

Cách của Kotlin

editText.setOnFocusChangeListener { _, hasFocus ->
    if (!hasFocus) {  }
}

1

Nó hoạt động đúng

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

Sử dụng biểu thức lambda Java 8:

editText.setOnFocusChangeListener((v, hasFocus) -> {
    if(!hasFocus) {
        String value = String.valueOf( editText.getText() );
    }        
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.