การนับตัวอักษรใน EditText Changed Listener


272

EditTextในโครงการของฉันฉันมี ฉันต้องการที่จะนับตัวละครในนั้นและแสดงตัวเลขที่มันในEditText TextViewฉันได้เขียนรหัสต่อไปนี้และใช้งานได้ดี อย่างไรก็ตามปัญหาของฉันคือเมื่อฉันคลิกBackspaceมันจะนับขึ้น แต่ฉันต้องลดจำนวนลง ฉันจะพิจารณาได้Backspaceอย่างไร

tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        i++;
        tv.setText(String.valueOf(i) + " / " + String.valueOf(charCounts));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 

36
โปรดยกโทษความไม่เกี่ยวข้อง แต่ฉันอยากรู้ว่าคุณวาง "backspace" ไว้ในการจัดรูปแบบคำถามของคุณได้อย่างไร? ฉันถามคำถามที่คล้ายกันซึ่งเทคนิคนั้นมีประโยชน์มาก
AlleyOOP

59
วางคำของคุณ (ในกรณีนี้ Backspace) ระหว่างแท็ก <kbd> </kbd> เช่น: <kbd> Backspace </kbd>
Hesam

2
เมื่อใดก็ตามที่คุณเห็นการจัดรูปแบบที่น่าสนใจ (เช่น "backspace") คุณสามารถคลิกลิงก์ "แก้ไข" เพื่อดูว่าผู้เขียนทำมันอย่างไร จากนั้นเพียงคลิก "ยกเลิก" เพื่อยกเลิกการแก้ไขของคุณ
Suragch

คำตอบ:


142

ใช้

s.length()

ต่อไปนี้เป็นข้อเสนอแนะครั้งเดียวในหนึ่งในคำตอบ แต่มันไม่มีประสิทธิภาพมาก

textMessage.getText().toString().length()

38

ลองเพิ่มความยาวของถ่านใน EditText ของคุณแล้วแสดงมัน?

บางสิ่งบางอย่างตามแนวของ

tv.setText(s.length() + " / " + String.valueOf(charCounts));

6
ก็จะยิ่งง่ายกว่านั้น - คุณก็สามารถโทรไม่จำเป็นต้องทำtextMessage.length() developer.android.com/reference/android/widget/…getText().toString()
Yoni Samlan

28

การเปลี่ยนแปลงเล็กน้อยในรหัสของคุณ:

TextView tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        tv.setText(String.valueOf(s.toString().length()));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 

1
นี้จะไม่ทำงานตามที่เขียน - ความยาว () ส่งกลับ int และ setText คาดว่าสตริง
Martin Lockett

1
@MartinLockett ใช้ Integer.toString (int_type) เพื่อแปลงสตริงเป็น int
Mehdi Rostami

6

นี่เป็นคำตอบทั่วไปเพิ่มเติมเล็กน้อยพร้อมคำอธิบายเพิ่มเติมสำหรับผู้ดูในอนาคต

เพิ่มฟังข้อความเปลี่ยน

หากคุณต้องการค้นหาความยาวข้อความหรือทำอย่างอื่นหลังจากที่ข้อความถูกเปลี่ยนคุณสามารถเพิ่มผู้ฟังที่เปลี่ยนข้อความให้กับข้อความแก้ไขของคุณ

EditText editText = (EditText) findViewById(R.id.testEditText);
editText.addTextChangedListener(new TextWatcher() {

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

    }

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

    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
});

ฟังความต้องการTextWatcherซึ่งจะต้องมีสามวิธีที่จะแทนที่: beforeTextChanged, และonTextChangedafterTextChanged

การนับจำนวนตัวอักษร

คุณสามารถรับจำนวนตัวละครในonTextChangedหรือbeforeTextChangedด้วย

charSequence.length()

หรือafterTextChangedด้วย

editable.length()

ความหมายของวิธีการ

พารามิเตอร์มีความสับสนเล็กน้อยดังนั้นนี่คือคำอธิบายเพิ่มเติมเล็กน้อย

beforeTextChanged

beforeTextChanged(CharSequence charSequence, int start, int count, int after)

  • charSequence: นี่คือเนื้อหาข้อความก่อนทำการเปลี่ยนแปลงที่รอดำเนินการ คุณไม่ควรลองเปลี่ยนมัน
  • start: นี่คือดัชนีที่จะแทรกข้อความใหม่ หากเลือกช่วงไว้แสดงว่าเป็นดัชนีเริ่มต้นของช่วง
  • count: นี่คือความยาวของข้อความที่เลือกที่จะถูกแทนที่ ถ้าไม่มีอะไรจะเลือกแล้วจะcount0
  • after: นี่คือความยาวของข้อความที่จะแทรก

onTextChanged

onTextChanged(CharSequence charSequence, int start, int before, int count)

  • charSequence: นี่คือเนื้อหาข้อความหลังจากทำการเปลี่ยนแปลง คุณไม่ควรพยายามแก้ไขค่านี้ที่นี่ ปรับเปลี่ยนeditableในafterTextChangedถ้าคุณต้องการ
  • start: นี่คือดัชนีของจุดเริ่มต้นของข้อความใหม่ที่ถูกแทรก
  • before: นี่คือค่าเก่า มันคือความยาวของข้อความที่เลือกก่อนหน้านี้ที่ถูกแทนที่ นี่เป็นค่าเดียวกับcountในbeforeTextChangedใน
  • count: นี่คือความยาวของข้อความที่ถูกแทรก นี่เป็นค่าเดียวกับafterในbeforeTextChangedใน

afterTextChanged

afterTextChanged(Editable editable)

เช่นonTextChangedนี้ถูกเรียกหลังจากการเปลี่ยนแปลงได้ทำไปแล้ว อย่างไรก็ตามตอนนี้ข้อความอาจถูกแก้ไข

  • editable: EditTextนี่คือข้อความที่แก้ไขได้ของ ถ้าคุณเปลี่ยนมันคุณต้องระวังไม่ให้วนซ้ำไม่สิ้นสุด ดูเอกสารประกอบสำหรับรายละเอียดเพิ่มเติม

ภาพเพิ่มเติมจากคำตอบนี้

ป้อนคำอธิบายรูปภาพที่นี่


0

TextWatcher maritalStatusTextWatcher = ใหม่ TextWatcher () {@ ยกเลิกโมฆะสาธารณะ public beforeTextChanged (CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        try {
            if (charSequence.length()==0){
                topMaritalStatus.setVisibility(View.GONE);
            }else{
                topMaritalStatus.setVisibility(View.VISIBLE);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void afterTextChanged(Editable editable) {

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