实时字符数为EditText

我想知道在Android中编辑文本框的最佳方式是进行字符计数。 我正在看这个,但我似乎没有任何意义。

为了描述这个问题,我有一个EditText,我想限制字符数为150.我可以用一个inputfilter来实现,但是我想在文本框下面显示用户input的字符数(几乎像堆栈溢出正在做)。

如果有人可以写一小段示例代码,或指向正确的方向我会很感激。

您可以使用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) { } }; 

你使用TextTextatcher来设置edittext

 mEditText.addTextChangedListener(mTextEditorWatcher); 

您可以使用TextInputLayout封装器为xml本身进行字符计数,以便在SupportLibrary v23.1中引入EditText

只需用一个TextInputLayout包装你的EditText,并将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> 

你会得到像这样的重大影响

您可以使用counterOverflowTextAppearancecounterTextAppearance来设置计数器的样式。

编辑

从Android文档。

提供TextInputEditText类用作此布局的子项。 使用TextInputEditText允许TextInputLayout更好地控制任何文本input的视觉方面。 一个示例用法如下:

  <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

其非常简单按照下面的说明:

====将它们添加到您的导入===

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

=====定义这个=====

 private TextView sms_count; 

==========里面创build=====

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

只需在XML文件的TextInputLayout中设置这两行:

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

你可以用TextInputLayout和compat库来完成:

 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> 

我遇到了同样的问题,我试图卡梅隆的方法。 它的工作原理,但有一个小错误:如果用户使用复制和粘贴,然后它不能计算字符。 所以我build议在文字改变之后再做,如下图:

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

在xml中为editText添加此属性

  android:maxLength="80" 

在java中添加这个监听器

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

尝试做这样的事情。

与获取CharSequence.length相比,此解决scheme可能更具性能。 每次轻按软键盘,事件就会触发。 因此,如果你做了一个长度,每次都会计算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)); } } 

使用android:maxLength =“140”

这应该工作。 🙂

希望有所帮助