标签: textwatcher

Android使用文本观察器来防止输入特殊字符

我想制作一个EditText盒子并TextWatcher用来防止输入特殊字符.

android textwatcher

5
推荐指数
1
解决办法
3777
查看次数

替换android中TextWatcher中的字符

我使用TextWatcher来更改按下的键值.我的目标是在打字时更换一些字符.例如,当我键入键时,如果达到"S"字符,则将其替换为"a"字符.我的问题是:我应该在beforeTextChanged吗?怎么样?谁能举个例子?

java android textwatcher

5
推荐指数
2
解决办法
7428
查看次数

将EditText电话号码格式化为用户类型

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)

formatting android textwatcher android-edittext

5
推荐指数
1
解决办法
1526
查看次数

使用TextWatcher动态掩码?

我正在尝试使用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)

android textwatcher android-edittext

5
推荐指数
1
解决办法
2969
查看次数

textwatcher上的IndexOutOfBoundsException

我正在使用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)

android textwatcher

5
推荐指数
1
解决办法
982
查看次数

在TextWatcher中更改文本后,EditText未更新

我有一个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是可编辑的,它们应该始终匹配.我错过了什么吗?

android textwatcher android-edittext

4
推荐指数
1
解决办法
1万
查看次数

Android:用户完成编辑后评估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)

android button textwatcher android-edittext

4
推荐指数
1
解决办法
7682
查看次数

如何过滤EditText的输入?

我想过滤一个输入EditText,只允许数字和字母,首先我TextWatcher用来处理最后一个输入字符,但是当你移动光标或者你经过一些内容时EditText,这个方法失败了,现在我想知道有没有办法过滤非法输入并给用户一个反馈.

android textwatcher android-edittext android-input-filter

4
推荐指数
3
解决办法
1万
查看次数

将TextWatcher添加到具有MenuItem.SHOW_AS_ACTION_ALWAYS的ActionBarSherlock内的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

3
推荐指数
1
解决办法
1825
查看次数

使用edittext和textwatcher的Listview.Textwatcher多次触发(超过3次)

我有一个自定义列表适配器,其中一个列表项有三个编辑文本.我有一个日期选择器.设置日期后,适配器的相应模型将正确保存日期.但对于其他编辑文本,我只想将输入的文本存储在列表中.我使用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)

android textwatcher android-edittext

3
推荐指数
1
解决办法
5046
查看次数