EditText için canlı karakter sayısı


103

Android'de bir metin düzenleme kutusunun canlı karakter sayısını yapmanın en iyi yolunun ne olduğunu merak ediyordum. Ben baktığım bu ama bundan herhangi bir anlam gibi görünüyor olabilir.

Sorunu açıklamak için, bir EditText var ve karakterleri 150 ile sınırlamaya çalışıyorum. Bunu bir giriş filtresi ile yapabilirim, ancak metin kutusunun hemen altında bir kullanıcının girdiği karakter sayısını göstermek istiyorum (Neredeyse Şu anda yığın taşması yaptığı gibi).

Birisi küçük bir örnek kod parçası yazabilir veya beni doğru yöne yönlendirebilirse, çok memnun olurum.

Yanıtlar:


154

metnin ne zaman değiştiğini görmek için bir TextWatcher kullanabilirsiniz

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) {
        }
};

edittext için TextWatcher'ı şu şekilde ayarlarsınız:

mEditText.addTextChangedListener(mTextEditorWatcher);

5
bunu denedi, harika çalışıyor! doğru cevap olarak seçilmelidir!
Patrick Boos

2
Metin kutusunun sağ alt köşesinde sayıyı eklemenin en iyi yolu nedir? Düzenleme metni uzatılsın ve dizeyi manuel olarak çizilsin mi?
Ayı

1
Teşekkürler ben de anladım, ama metne girerken 150.149.148.147 gibi ters sırada nasıl geri sayılır.
vinay Maneti

6
Bu satır mTextView.setText (String.valueOf (150-s.length ())) ile değiştirilerek çözüldü; mTextView.setText (String.valueOf (s.length ())) yerine;
vinay Maneti

Benim sorunum @ Bear have ile benzer. Bu geri sayım metnini düzenleme metninin hemen altında göstermem gerekiyor. Bu referansta paylaşacak herhangi bir şeyi olan var. Teşekkürler.
Suresh Sharma

108

SupportLibrary v23.1'de tanıtılan EditText için TextInputLayout sarmalayıcısını kullanarak xml'nin kendisinden karakter sayımı yapabilirsiniz.

EditText'inizi bir TextInputLayout ile sarın ve CounterEnabled'ı true olarak ayarlayın ve bir counterMaxLength ayarlayın.

<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>

Sen gibi önemli bir etkiye alırsınız bu

Sen kullanabilir counterOverflowTextAppearance , counterTextAppearance stiline sayacı.

DÜZENLE

Android belgelerinden.

TextInputEditText sınıfı Bu düzenin bir çocuk olarak kullanılmak üzere sağlanır. TextInputEditText kullanımı, TextInputLayout'a herhangi bir metin girişinin görsel yönleri üzerinde daha fazla kontrol sağlar. Örnek bir kullanım şöyledir:

     <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
tam olarak aradığım buydu :) temiz, destek kitaplığı uygulaması. teşekkürler
VPZ

3
Kabul Edilen cevap olmalı! Bu nitelikleri tamamen özledim!
sud007

25

Bunu TextInputLayoutkitaplıklarla yapabilir ve aşağıdakilerle uyumlu hale getirebilirsiniz :

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

Ve tamamla:

<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>

Harika, bu benim için çalıştı, ama tezgahın rengini nasıl değiştiririm?
Erich García

14

xml'de editText için bu niteliği ekleyin

    android:maxLength="80"

Java'da bu dinleyiciyi ekle

  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

Çok Basit Aşağıdaki talimatları izleyin:

==== Bunları İthalatlarınıza Ekleyin ===

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

===== Bunu tanımlayın =====

private TextView sms_count;

========== Oluşturmada İçeride =====

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()));
        }
    };

Teşekkürler @RavishSharma :) Yorumunuzu takdir ediyorum.
Rana Pratap Singh

4

TextInputLayoutXML dosyanızda şu 2 satırı ayarlayın :

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

Great bunu bilmiyordu. Bir Edittext'i bir TextInputLayout'a sarmak her zaman daha iyi bir çözüm gibi görünüyor.
Stefan Sprenger

3

Bu çözüm, Kotlinkalan karakter sayısını kullanır ve gösterir. Ayrıca, mevcut karakter sayısı 50 sınırını aşarsa, metin rengi kırmızıya dönecektir.

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) {}
}

Ayrıca, eklemeyi unutmayın TextWatcheriçin seninEditText

YOUR_EDIT_TEXT_ID.addTextChangedListener(mTitleTextWatcher)

3

TextInputEditText'inize bir TextInputLayout içinde sarılmış bir sayaç ekleyebilirsiniz. Örnekte görebileceğiniz gibi, counterEnabledbu özelliği etkinleştirin ve counterMaxLenghonun için karakter sayısını tanımlar.

<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

Aynı problemle karşılaştım ve Cameron'un yöntemini denedim. Çalışıyor ancak küçük bir hata var: Eğer kullanıcı kopyala ve yapıştır kullanırsa, karakterleri sayamaz. Bu yüzden, aşağıdaki gibi metin değiştikten sonra yapmanızı öneririm:

    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

Bunun gibi bir şey yapmayı dene.

Bu çözüm, CharSequence.length'i almak yerine daha performanslı olabilir. Yazılım klavyesine her dokunduğunuzda olay tetiklenir; bu nedenle, bir uzunluk yaparsanız, her seferinde CharSequence sayılır, bu da büyük CharSequnces'e girmeye başlarsanız yavaşlayabilir. Metin değişikliğindeki olay dinleyicisi sayım öncesi ve sonrasını işaretler. Bu, artış ve azalma değerleri için iyi çalışır

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

bu etki kalıcıdır, TextWatcher bunun için en iyi Yaklaşımdır
Naveed Ahmad

0

bunu dene

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

Açık yol;

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()
            }
        });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.