ฉันจะรู้ได้อย่างไรเมื่อ EditText เสียโฟกัส


162

ฉันต้องการที่จะจับเมื่อEditTextสูญเสียการโฟกัสฉันได้ค้นหาคำถามอื่น ๆ แต่ฉันไม่พบคำตอบ

ฉันใช้OnFocusChangeListenerสิ่งนี้

OnFocusChangeListener foco = new OnFocusChangeListener() {

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

    }
};

แต่มันไม่ได้ผลสำหรับฉัน

คำตอบ:


343

ดำเนินonFocusChangeการsetOnFocusChangeListenerและมีพารามิเตอร์บูลีนสำหรับ hasFocus เมื่อสิ่งนี้เป็นเท็จคุณได้สูญเสียการมุ่งเน้นไปที่การควบคุมอื่น

 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 - แต่น่าสังเกตว่าถ้าข้อความแก้ไขของคุณอยู่ใน listview คีย์ทุกปุ่มจะส่งผลให้กล่องหายไปและได้รับโฟกัส ดูโซลูชันนี้เพื่อติดตามกล่องโฟกัสปัจจุบัน: stackoverflow.com/questions/9527067/…
bsautner

ฉันจะเพิ่มรหัสที่คุณแสดงได้ที่ไหน ถ้าฉันบอกว่ามันอยู่ใน "onCreate" แอพขัดข้อง
Jona

@ Léon Pelletier ความจริงเหรอ? จริงๆ? ผู้ใช้สัมผัสตัวควบคุมอื่นที่สามารถโฟกัสได้และ 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
ทำไมไม่ใช้ 'else' แทน '! hasFocus'
Salman Nazir

ในเวลานั้นฉันแค่ต้องการทำให้สิ่งต่าง ๆ ชัดเจนมาก แต่อย่างที่ฉันบอกว่ามันไม่สามารถใช้งานได้อย่างที่มันเป็น ...
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 แลมบ์ดา:

editText.setOnFocusChangeListener((v, hasFocus) -> {
    if(!hasFocus) {
        String value = String.valueOf( editText.getText() );
    }        
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.