实时字符数为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>
你会得到像这样的重大影响
您可以使用counterOverflowTextAppearance , counterTextAppearance来设置计数器的样式。
编辑
从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”
这应该工作。 🙂
希望有所帮助