จำนวนอักขระสดสำหรับ EditText


103

ฉันสงสัยว่าวิธีที่ดีที่สุดในการนับจำนวนอักขระสดของกล่องข้อความแก้ไขคืออะไรใน Android ฉันกำลังดูสิ่งนี้แต่ดูเหมือนจะไม่เข้าใจอะไรเลย

เพื่ออธิบายปัญหาฉันมี EditText และฉันพยายาม จำกัด อักขระไว้ที่ 150 ตัวฉันสามารถทำได้ด้วยตัวกรองอินพุต แต่ฉันต้องการแสดงจำนวนอักขระที่ผู้ใช้ป้อนด้านล่างกล่องข้อความ (เกือบ เช่นเดียวกับที่ stack overflow กำลังทำอยู่)

หากมีใครสามารถเขียนโค้ดตัวอย่างเล็ก ๆ น้อย ๆ หรือชี้ให้ฉันไปในทิศทางที่ถูกต้องฉันจะขอบคุณมาก

คำตอบ:


154

คุณสามารถใช้ TextWatcher เพื่อดูว่าข้อความมีการเปลี่ยนแปลงเมื่อใด

private TextView mTextView;
private EditText mEditText;
private final TextWatcher mTextEditorWatcher = new TextWatcher() {
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
           //This sets a textview to the current length
           mTextView.setText(String.valueOf(s.length()));
        }

        public void afterTextChanged(Editable s) {
        }
};

คุณตั้งค่า TextWatcher สำหรับ edittext ด้วย

mEditText.addTextChangedListener(mTextEditorWatcher);

5
ลองแล้วได้ผลดีมาก! ควรเลือกเป็นคำตอบที่ถูกต้อง!
Patrick Boos

2
วิธีใดเป็นวิธีที่ดีที่สุดในการเพิ่มจำนวนให้พูดที่ด้านล่างขวาของกล่องข้อความ ขยายแก้ไขข้อความและวาดสตริงด้วยตนเอง?
แบร์

1
ขอบคุณฉันก็เช่นกัน แต่จะนับถอยหลังในลำดับย้อนกลับได้อย่างไรเช่น 150,149,148,147 .... ในขณะที่ป้อนข้อความ
vinay Maneti

6
แก้ไขโดยการแทนที่ด้วยบรรทัดนี้ mTextView.setText (String.valueOf (150-s.length ())); แทนที่ mTextView.setText (String.valueOf (s.length ()));
vinay Maneti

ปัญหาของฉันคล้ายกับที่หมีมี ฉันต้องการแสดงข้อความนับถอยหลังด้านล่างของข้อความแก้ไข ใครมีอะไรจะแบ่งปันในการอ้างอิงนี้ ขอบคุณ.
Suresh Sharma

108

คุณสามารถนับอักขระจาก xml เองโดยใช้TextInputLayout wrapper สำหรับ EditText ที่แนะนำในSupportLibrary v23.1

เพียงห่อ EditText ของคุณด้วย TextInputLayout และตั้งค่า CounterEnabled เป็น true และตั้ง counterMaxLength

<android.support.design.widget.TextInputLayout
    android:id="@+id/textContainer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterEnabled="true"
    app:counterMaxLength="20"
    >
    <EditText
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Text Hint"
        />
</android.support.design.widget.TextInputLayout>

คุณจะได้รับเอฟเฟกต์วัสดุเช่น นี้

คุณอาจจะใช้counterOverflowTextAppearance , counterTextAppearanceเพื่อจัดรูปแบบตัวนับ

แก้ไข

จากเอกสาร Android

TextInputEditTextชั้นมีไว้เพื่อนำมาใช้เป็นเด็กของรูปแบบนี้ การใช้ TextInputEditText ช่วยให้ TextInputLayout ควบคุมลักษณะการมองเห็นของการป้อนข้อความได้ดีขึ้น ตัวอย่างการใช้งานมีดังนี้:

     <android.support.design.widget.TextInputLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content">

     <android.support.design.widget.TextInputEditText
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:hint="@string/form_username"/>

 </android.support.design.widget.TextInputLayout>

TextInputLayout TextInputEditText


3
นี่คือสิ่งที่ฉันกำลังมองหา :) ซึ่งเป็นห้องสมุดสนับสนุนที่สะอาดตา ขอบคุณ
VPZ

3
ควรเป็นคำตอบที่ได้รับการยอมรับ! ฉันพลาดคุณสมบัติเหล่านั้นไปโดยสิ้นเชิง!
sud007

25

คุณสามารถทำได้โดยใช้TextInputLayoutและเข้ากับไลบรารีด้วย:

app:counterEnabled="true"
app:counterMaxLength="420"

และเสร็จสมบูรณ์:

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterEnabled="true"
    app:counterMaxLength="420">

    <EditText
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:maxLength="420" />

</android.support.design.widget.TextInputLayout>

สิ่งนี้ใช้ได้ผลดีสำหรับฉัน แต่ฉันจะเปลี่ยนสีของเคาน์เตอร์ได้อย่างไร?
Erich García

14

ใน xml เพิ่มแอตทริบิวต์นี้สำหรับ editText

    android:maxLength="80"

ใน java เพิ่ม Listener นี้

  ed_caption.addTextChangedListener(new TextWatcher() {
        @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) {
            tv_counter.setText(80 - s.toString().length() + "/80");

        }
    });

7

ง่ายมากทำตามคำแนะนำด้านล่าง:

==== เพิ่มในการนำเข้าของคุณ ===

import android.text.Editable;
import android.text.TextWatcher;

===== กำหนดสิ่งนี้ =====

private TextView sms_count;

========== ภายในสร้าง =====

sms_count = (TextView) findViewById(R.id.textView2);


final TextWatcher txwatcher = new TextWatcher() {
   public void beforeTextChanged(CharSequence s, int start, int count, int after) {
   }

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

      sms_count.setText(String.valueOf(s.length()));
   }

   public void afterTextChanged(Editable s) {
   }
};

sms_message.addTextChangedListener(txwatcher);

5
    You can use TextWatcher class to see text has changed and how much number of character remains.Here i have set counter of 140 characters.

    EditText typeMessageToPost;
    TextView number_of_character;
public void onCreate(Bundle savedBundleInstance) {
        super.onCreate(savedBundleInstance);
setContentView(R.layout.post_activity);
typeMessageToPost.addTextChangedListener(mTextEditorWatcher);
}
private final TextWatcher mTextEditorWatcher=new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            number_of_character.setText(String.valueOf(140-s.length()));
        }
    };

ขอบคุณ @RavishSharma :) ฉันขอขอบคุณสำหรับความคิดเห็นของคุณ
Rana Pratap Singh

4

เพียงตั้งค่า 2 บรรทัดนี้ในTextInputLayoutไฟล์ XML ของคุณ:

app:counterEnabled="true"
app:counterMaxLength="200"

เกรทไม่รู้เรื่องนั้น ดูเหมือนว่าจะเป็นทางออกที่ดีกว่าเสมอในการรวม Edittext ไว้ใน TextInputLayout
Stefan Sprenger

3

โซลูชันนี้ใช้Kotlinและแสดงจำนวนอักขระที่เหลือ นอกจากนี้หากจำนวนอักขระในปัจจุบันเกินขีด จำกัด 50 ตัวสีข้อความจะเปลี่ยนเป็นสีแดง

Kotlin

private val mTitleTextWatcher = object : TextWatcher {
    override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}

    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
        if(YOUR_EDIT_TEXT_ID.text.toString().trim().length < 51){
            YOUR_CHAR_LEFT_TEXTVIEW_ID.text = (50 - YOUR_EDIT_TEXT_ID.text.toString().trim().length).toString()
            YOUR_CHAR_LEFT_TEXTVIEW_ID.setTextColor(Color.BLACK)
        }
        else{
            YOUR_CHAR_LEFT_TEXTVIEW_ID.text = "0"
            YOUR_CHAR_LEFT_TEXTVIEW_ID.setTextColor(Color.RED)
        }
    }

    override fun afterTextChanged(s: Editable) {}
}

ยังไม่ลืมที่จะเพิ่มTextWatcherที่คุณEditText

YOUR_EDIT_TEXT_ID.addTextChangedListener(mTitleTextWatcher)

3

คุณสามารถเพิ่มตัวนับให้กับ TextInputEditText ของคุณที่ถูกรวมไว้ใน TextInputLayout ดังที่คุณเห็นในตัวอย่างcounterEnabledเปิดใช้งานคุณลักษณะนี้และcounterMaxLenghกำหนดจำนวนอักขระสำหรับคุณลักษณะนี้

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/til_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:counterEnabled="true"
        app:counterMaxLength="50">
    <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/et_title"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
</com.google.android.material.textfield.TextInputLayout>

2

ฉันพบปัญหาเดียวกันและฉันลองวิธีของคาเมรอน ใช้งานได้ แต่มีข้อผิดพลาดเล็กน้อย: หากผู้ใช้ใช้การคัดลอกและวางจะไม่สามารถนับอักขระได้ ดังนั้นฉันขอแนะนำให้ทำหลังจากเปลี่ยนข้อความดังต่อไปนี้:

    private final TextWatcher mTextEditorWatcher = new TextWatcher() {
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {

         }

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

         }

          public void afterTextChanged(Editable s) {
             //This sets a textview to the current length
             mTextView.setText(String.valueOf(s.length()));
         }
    };


0

ลองทำอะไรแบบนี้

โซลูชันนี้อาจมีประสิทธิภาพมากกว่าเมื่อเทียบกับการรับ CharSequence.length ทุกครั้งที่คุณแตะบนคีย์บอร์ดนุ่มเหตุการณ์จะเริ่มขึ้น ดังนั้นหากคุณทำความยาวมันจะนับ CharSequence ทุกครั้งซึ่งอาจช้าลงหากคุณเริ่มเข้าสู่ CharSequnces ขนาดใหญ่ ผู้ฟังเหตุการณ์เกี่ยวกับการเปลี่ยนแปลงข้อความจะใช้การนับก่อนและหลัง สิ่งนี้ใช้ได้ดีสำหรับค่าที่เพิ่มขึ้นและลดลง

@Override
        public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
            int tick = start + after;
            if(tick < mMessageMax) {
                int remaining = mMessageMax - tick;
                ((TextView)findViewById(R.id.contact_us_chars)).setText(String.valueOf(remaining));
            }
        }

นี่คือผลกระทบต่อการเปลี่ยนแปลง TextWatcher เป็นแนวทางที่ดีที่สุดสำหรับสิ่งนี้
Naveed Ahmad

0

ลองดู

private TextWatcher textWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
        editText.post(new Runnable() {
            @Override
            public void run() {
                if (length < 100) {
                    if (count > 0 && after <= 0)/*remove emoij*/ {
                        length--;
                    } else if (count > after)/*remove text*/ {
                        length--;
                    } else if (count == 0 && after > 1)/*emoij*/ {
                        ++length;
                    } else if (count == 0 && after == 1)/*Text*/ {
                        ++length;
                    } else if (count > 0 && after > 1) {
                        ++length;
                    }
                    if (s.length() <= 0)
                        length = 0;
                    Log.w("MainActivity", " Length: " + length);
                } else {
                    if (count > 0 && after <= 0)/*remove emoij*/ {
                        length--;
                    } else if (count > after)/*remove text*/ {
                        length--;
                    }
                    Log.w("MainActivity", " Length: " + length);
                }

                if (length == 100) {
                    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(s.length())});
                } else {
                    editText.setFilters(new InputFilter[]{});
                }
            }
        });
    }

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

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
};

`


0

วิธีที่ชัดเจน;

abstract class CharacterWatcher : TextWatcher {
    override fun afterTextChanged(text: Editable?) {
        afterCharacterChanged(text?.lastOrNull(), text?.length)
    }

    override fun beforeTextChanged(text: CharSequence?, start: Int, count: Int, before: Int) {}

    override fun onTextChanged(text: CharSequence?, start: Int, before: Int, count: Int) {}

    abstract fun afterCharacterChanged(char: Char?, count: Int?)
}



 editText.addTextChangedListener(new CharacterWatcher() {
            @Override
            public void afterCharacterChanged(@Nullable Character character, @Nullable Integer count) {
                action()
            }
        });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.