android edittext onchange ฟัง


115

ฉันรู้เรื่องเล็กน้อยTextWatcherแต่มันเกิดขึ้นกับทุกตัวละครที่คุณป้อน ฉันต้องการผู้ฟังที่เริ่มทำงานทุกครั้งที่ผู้ใช้แก้ไขเสร็จสิ้น เป็นไปได้ไหม? นอกจากนี้TextWatcherฉันยังได้รับอินสแตนซ์Editableแต่ฉันต้องการอินสแตนซ์ของEditText. ฉันจะได้รับสิ่งนั้นได้อย่างไร?

แก้ไข : คำถามที่สองสำคัญกว่า ช่วยตอบทีครับ


1
พยายามเพิ่มตัวฟังโฟกัสเมื่อ editText จับโฟกัสนั่นหมายความว่าผู้ใช้เริ่มแก้ไขแล้วและเมื่อ editText สูญเสียโฟกัสหมายความว่าการแก้ไขเสร็จสิ้น
Houcine

คำตอบ:


215

ขั้นแรกคุณสามารถดูว่าผู้ใช้แก้ไขข้อความเสร็จแล้วEditTextหรือไม่หากโฟกัสสูญเสียหรือผู้ใช้กดปุ่มเสร็จสิ้น (ขึ้นอยู่กับการใช้งานของคุณและสิ่งที่เหมาะกับคุณที่สุด) ประการที่สองคุณไม่สามารถรับEditTextอินสแตนซ์ภายในได้TextWatcherหากคุณได้ประกาศEditTextว่าเป็นวัตถุอินสแตนซ์เท่านั้น แม้ว่าคุณไม่ควรแก้ไขEditTextภายในTextWatcherเนื่องจากไม่ปลอดภัย

แก้ไข:

เพื่อให้สามารถนำEditTextอินสแตนซ์ไปTextWatcherใช้งานได้คุณควรลองสิ่งนี้:

public class YourClass extends Activity {

    private EditText yourEditText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        yourEditText = (EditText) findViewById(R.id.yourEditTextId);

        yourEditText.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {

                // you can call or do what you want with your EditText here

                // yourEditText... 
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            public void onTextChanged(CharSequence s, int start, int before, int count) {}
        });
    }
}

โปรดทราบว่าตัวอย่างด้านบนอาจมีข้อผิดพลาดบางประการ แต่ฉันต้องการแสดงตัวอย่างให้คุณเห็น


18

มันรบกวนฉันที่การใช้ Listener สำหรับฟิลด์ EditText ทั้งหมดของฉันทำให้ฉันต้องมีโค้ด verbose ที่น่าเกลียดดังนั้นฉันจึงเขียนคลาสด้านล่าง อาจเป็นประโยชน์กับทุกคนที่สะดุดกับสิ่งนี้

public abstract class TextChangedListener<T> implements TextWatcher {
    private T target;

    public TextChangedListener(T target) {
        this.target = target;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {}

    @Override
    public void afterTextChanged(Editable s) {
        this.onTextChanged(target, s);
    }

    public abstract void onTextChanged(T target, Editable s);
}

ตอนนี้การใช้งาน Listener เป็นเรื่องที่สะอาดขึ้นเล็กน้อย

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
            @Override
            public void onTextChanged(EditText target, Editable s) {
                //Do stuff
            }
        });

สำหรับความถี่ที่มันเริ่มทำงานเราอาจใช้การตรวจสอบเพื่อเรียกใช้โค้ดที่ต้องการ//Do stuffหลังจากได้รับไฟล์


สิ่งนี้ได้ผลดีสำหรับฉันประหยัดบรรทัดรหัสได้มาก! คุณเป็นอัจฉริยะ!
huypham99

12

ใครก็ตามที่ใช้ButterKnife คุณสามารถใช้เช่น:

@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {

}

6

ฉันได้ทำโดยใช้AutotextView:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        seq = cs;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {

    }

    @Override
    public void afterTextChanged(Editable arg0) {
        new SearchTask().execute(seq.toString().trim());
    }

});

3
 myTextBox.addTextChangedListener(new TextWatcher() {  

    public void afterTextChanged(Editable s) {}  

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

    public void onTextChanged(CharSequence s, int start, int before, int count) {  

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);  
    myOutputBox.setText(s);  

    }  
});  

2
มีสิ่งที่ไม่จำเป็น} ในตอนท้าย
Howard

2

TextWatcherไม่ได้ผลสำหรับฉันเพราะมันยังคงโหมกระหน่ำสำหรับทุกคนEditTextและทำให้คุณค่าของกันและกันยุ่งเหยิง

นี่คือทางออกของฉัน:

public class ConsultantTSView extends Activity {
    .....

    //Submit is called when I push submit button.
    //I wanted to retrieve all EditText(tsHours) values in my HoursList

    public void submit(View view){

        ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
        String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
    }
}

ดังนั้นโดยใช้getChildAt(xx)วิธีการที่คุณสามารถดึงรายการใด ๆ ในและได้รับแต่ละรายการใช้ListView findViewByIdจากนั้นจะให้ค่าล่าสุด


1

เท่าที่ฉันคิดเกี่ยวกับเรื่องนี้มีเพียงสองวิธีที่คุณสามารถทำได้ คุณจะรู้ได้อย่างไรว่าผู้ใช้เขียนคำศัพท์เสร็จแล้ว? ไม่ว่าจะโฟกัสหายไปหรือคลิกปุ่ม "ตกลง" ไม่มีทางในใจของฉันคุณสามารถรู้ว่าผู้ใช้กดอักขระสุดท้าย ...

ดังนั้นโทรonFocusChange(View v, boolean hasFocus)หรือเพิ่มปุ่มและฟังคลิก


0

เมธอด Watcher จะเริ่มทำงานในทุกการป้อนอักขระ ดังนั้นฉันจึงสร้างรหัสนี้ตามเมธอด onFocusChange:

public static boolean comS(String s1,String s2){
    if (s1.length()==s2.length()){
        int l=s1.length();
        for (int i=0;i<l;i++){
            if (s1.charAt(i)!=s2.charAt(i))return false;
        }
        return true;
    }
    return false;
}

public void onChange(final EditText EdTe, final Runnable FRun){
    class finalS{String s="";}
    final finalS dat=new finalS();  
    EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {dat.s=""+EdTe.getText();}
            else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}       
        }
    });
}

ในการใช้งานเพียงเรียกสิ่งนี้:

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

คุณสามารถละเว้นฟังก์ชัน comS ได้โดยแทนที่! comS (dat.s, "" + EdTe.getText ()) ด้วย! เท่ากับฟังก์ชัน อย่างไรก็ตามฟังก์ชั่นเท่ากันบางครั้งทำงานไม่ถูกต้องในเวลาทำงาน

ผู้ฟัง onChange จะจดจำข้อมูลเก่าของ EditText เมื่อผู้ใช้พิมพ์โฟกัสจากนั้นเปรียบเทียบข้อมูลใหม่เมื่อผู้ใช้หลุดโฟกัสหรือข้ามไปยังอินพุตอื่น หากเปรียบเทียบสตริงเก่ากับสตริงใหม่ไม่เหมือนกันจะทำให้เกิดการทำงาน

หากคุณมีเพียง 1 EditText คุณจะต้องสร้างฟังก์ชัน ClearFocus โดยสร้าง Ultimate Secret Transparent Micro EditText Edit นอกหน้าต่าง😽และขอโฟกัสจากนั้นซ่อนแป้นพิมพ์ผ่าน Import Method Manager

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.