我想制作一个EditText盒子并TextWatcher用来防止输入特殊字符.
我使用TextWatcher来更改按下的键值.我的目标是在打字时更换一些字符.例如,当我键入键时,如果达到"S"字符,则将其替换为"a"字符.我的问题是:我应该在beforeTextChanged吗?怎么样?谁能举个例子?
EditText每当用户键入一个新角色时,我想编辑一个字段内容.基本上我想使用格式化电话号码libphonenumber.
我实现了一个TextWatcher读取字段内容并将其格式化为电话格式的内容.但每次我EditText使用格式化字符串设置文本时,再次调用观察者,再次设置文本,并且它会陷入此无限循环中.
将文本编辑为用户类型的最佳或正确方法是什么?
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() > 1) {
try {
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
PhoneNumber numberProto = phoneUtil.parse(editable.toString(), "BR");
String formatted = phoneUtil.format(numberProto, PhoneNumberFormat.NATIONAL);
telephone.setText(formatted);
} catch (NumberParseException e) {
Log.d("Telefone", "NumberParseException was thrown: " + e.toString());
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用EditText和TextWatcher创建掩码.这个掩码需要格式化一个电话号码,但问题是这个掩码我有两种情况.情况1面具需要有13位数(99)9999-9999,情况2需要有14位数(99)99999-9999.我希望当我键入数字格式化.
我怎么能这样做?
我正在尝试这个.
//Activity
private EditText etPhone;
etPhone = (EditText)findViewById(R.id.etPhone());
etPhone.addTextChangedListener(new TelefoneMask(etPhone));
//TextWatcher
public class TelefoneMask implements TextWatcher {
private String current;
private EditText phone;
private StringBuilder mask = new StringBuilder();
public TelefoneMask(EditText phone) {
this.phone = phone;
}
@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 synchronized void afterTextChanged(Editable s) {
// mask1 -> (99)9999-9999 …Run Code Online (Sandbox Code Playgroud) 我正在使用textwatcher来检查用户输入的有效性.我的一些用户遇到了这个textwacher引起的崩溃.这是google给出的堆栈跟踪:
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at android.widget.TextView.sendAfterTextChanged(TextView.java:7997)
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:10043)
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:497)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)
at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:679)
at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:437)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:333)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5584)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
我的代码:
Zipcode.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
} …Run Code Online (Sandbox Code Playgroud) 我有一个EditText和一个TextWatcher.
我的代码的骨架:
EditText x;
x.addTextChangedListener(new XyzTextWatcher());
XyzTextWatcher implements TextWatcher() {
public synchronized void afterTextChanged(Editable text) {
formatText(text);
}
}
Run Code Online (Sandbox Code Playgroud)
我的formatText()方法在文本的某些位置插入一些连字符.
private void formatText(Editable text) {
removeSeparators(text);
if (text.length() >= 3) {
text.insert(3, "-");
}
if (text.length() >= 7) {
text.insert(7, "-");
}
}
private void removeSeparators(Editable text) {
int p = 0;
while (p < text.length()) {
if (text.charAt(p) == '-') {
text.delete(p, p + 1);
} else {
p++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是 - 我的EditText上显示的内容与Editable不同步.当我调试代码时,我看到变量文本(可编辑)具有预期值,但EditText上显示的内容并不总是与Editable相匹配.
例如,当我有一个文本x ="123-456-789"时,我手动从x剪切文本"456".格式化后,我的可编辑值为"123-789-"但是,我的EditText上显示的值是"123--789"
但是在大多数情况下它们具有相同的值.
我假设EditText是可编辑的,它们应该始终匹配.我错过了什么吗?
我想要的是 我有一个EditText,用户可以输入一个值,例如10.40.一旦用户完成编辑,我将其输入格式化为货币,例如上面提到的值将被格式化为$ 10.40(在Locale.US的情况下).我将该结果显示在用户之前编辑的相同EditText中.
问题 因为我要格式化(即修改)他的输入,我需要知道他什么时候完成(因此我的格式不会干扰他正在进行的输入).
我尝试 TextWatcher不是一个选项,因为它会在每次编辑时触发,因此当用户输入一个,零,四,点和零(= 10.40)时.我目前正在使用OnFocusChangeListener,它可以正常工作,但问题是:我的应用程序中有按钮,如果用户在编辑EditText后单击按钮,EditText将不会丢失Focus,因此我的格式化代码永远不会被调用. ..
在此之后,我尝试弄乱按钮的焦点,将其设置为FocusableInTouchMode - 这导致按钮必须被点击两次才能触发(这是一个不行),因为它第一次获得焦点并且第二次获得激活时间.经过这么多的黑客攻击后,我想知道是否有人知道如何解决这个困境.
一些代码
我将以下OnFocusChangeListener添加到我的EditText,其功能我在上面描述.EditText封装在CurrencyTextbox中(实际上并不相关):
@Override
protected OnFocusChangeListener getOnFocusChangeListener() {
return new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
//Member variable in the class which contains an EditText
CurrencyTextbox.this.hadFocus = true;
} else {
// Thes EditText has lost focus
Log.v(TAG, "Lost focus.");
if (CurrencyTextbox.this.hadFocus) {
// We previously had focus, now we lost it, format the user input!
// Get current value of the …Run Code Online (Sandbox Code Playgroud) 我想过滤一个输入EditText,只允许数字和字母,首先我TextWatcher用来处理最后一个输入字符,但是当你移动光标或者你经过一些内容时EditText,这个方法失败了,现在我想知道有没有办法过滤非法输入并给用户一个反馈.
我正在使用ActionBarSherlock,我想用MenuItem.SHOW_AS_ACTION_ALWAYS在其中显示EditText.它需要条的整个宽度并根据需要显示.但是我在尝试添加TextWatcher时遇到了麻烦.
所以基于这里接受的答案:http://goo.gl/ite6h我写道:
EditText search;
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
menu.add(0, 1, 1, R.string.inlineSearch).setIcon(R.drawable.action_search).setActionView(search).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return super.onCreateOptionsMenu(menu);
}
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
Log.e("TextWatcher","after");
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.e("TextWatcher","before");
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.e("TextWatcher","onText");
}
};
@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
Log.e("onOptions",""+item.getItemId()); // Line 150
switch (item.getItemId()) {
case 1:
search = (EditText) item.getActionView(); …Run Code Online (Sandbox Code Playgroud) android menuitem textwatcher android-edittext actionbarsherlock
我有一个自定义列表适配器,其中一个列表项有三个编辑文本.我有一个日期选择器.设置日期后,适配器的相应模型将正确保存日期.但对于其他编辑文本,我只想将输入的文本存储在列表中.我使用textwatcher来完成任务.我的问题是文本观察者为视图中的单个条目多次触发(准确地说是5次).
如果其中一个编辑文本正常工作,为什么不能另一个?我真的可以使用一些帮助.到目前为止,我一直无法取得任何成功.
public class AddExpensesAdapter extends BaseAdapter{
private Activity activity;
private ArrayList<AddExpensesModel> addExpensesList;
private LayoutInflater inflater;
private TextView totalAmount;
private ArrayList<String> array_amount= new ArrayList<String>();
private ArrayList<String> array_name= new ArrayList<String>();
public AddExpensesAdapter(Activity activity, ArrayList<AddExpensesModel> addExpensesList) {
this.activity = activity;
this.addExpensesList = addExpensesList;
this.inflater = (LayoutInflater) this.activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return addExpensesList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
public AddExpensesModel getExpenseModel(int position)
{
return addExpensesList.get(position); …Run Code Online (Sandbox Code Playgroud)