首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义编辑文本Android

自定义编辑文本Android
EN

Stack Overflow用户
提问于 2014-06-02 17:08:16
回答 2查看 337关注 0票数 1

我有2个android项目。第一个项目-->我使用自定义常规表达式创建的自定义编辑文本,如下所示

代码语言:javascript
复制
private static final String QUANTITY_REGEX = "^\\d{0,4}(\\,\\d{0,3})?$";

第二个项目-->使用来自第一个项目的自定义编辑文本的项目。

在那之后,我将第一个类导出为第二个项目上的库,作为自定义edittext。

问题是:正如你在第一个项目中看到的,正则表达式只允许在编辑文本中先写4个数字,然后在",“符号之后写2个数字。但是我想让自定义编辑文本像这样

isFocused: 1234,56 !isFocused :1.23456

如何让它成为可能。thx

EN

回答 2

Stack Overflow用户

发布于 2014-06-02 21:14:11

将正则表达式更改为^\d{0,4}(.\d{0,4})?(,\d{0,2})?$

代码语言:javascript
复制
private static final String QUANTITY_REGEX ="^\\d{0,4}(.\\d{0,4})?(,\\d{0,2})?$";

比赛将会是

代码语言:javascript
复制
1234
1234.5678
1234.5678,12
票数 0
EN

Stack Overflow用户

发布于 2014-06-04 10:45:05

这是我想出来的..。希望对其他程序员有一定的借鉴作用

概念:1编辑文本

当用户关注编辑文本(txt1)时,用户只能写4个数字,一个逗号(",")和3个逗号(",") --> 1234,567

当( txt1 ) onFocused = false (用户点击另一个editText)时,txt1显示如下数字1.234,567

下面是代码

验证类

代码语言:javascript
复制
public class Validation {
// Regular Expression
// you can change the expression based on your need
private static final String EMAIL_REGEX = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
private static final String PHONE_REGEX = "\\d{3}-\\d{7}";
private static final String CURRENCY_REGEX = "^\\d{0,8}(\\,\\d{0,2})?$";
public String maxLength = Quantity.maxLengthFront;
public String QUANTITY_REGEX = null;

// Error Messages
private static final String REQUIRED_MSG = "required";
private static final String EMAIL_MSG = "invalid email";
private static final String PHONE_MSG = "###-#######";
private static final String CURRENCY_MSG = "invalid currency";
private static final String QUANTITY_MSG = "invalid quantity";

// call this method when you need to check email validation
public static boolean isEmailAddress(EditText editText, boolean required) {
    return isValid(editText, EMAIL_REGEX, EMAIL_MSG, required);
}

// call this method when you need to check phone number validation
public static boolean isPhoneNumber(EditText editText, boolean required) {
    return isValid(editText, PHONE_REGEX, PHONE_MSG, required);
}

// call this method when you need to check currency validation
public static boolean isCurrency(EditText editText, boolean required) {
    return isValid(editText, CURRENCY_REGEX, CURRENCY_MSG, required);
}

public  boolean isQuantity(EditText editText, boolean required){
    return isValid(editText, QUANTITY_REGEX, QUANTITY_MSG, required);
}
// return true if the input field is valid, based on the parameter passed
public static boolean isValid(EditText editText, String regex, String errMsg, boolean required) {

    String text = editText.getText().toString().trim();
    // clearing the error, if it was previously set by some other values
    editText.setError(null);

    // text required and editText is blank, so return false
    if ( required && !hasText(editText) ) return false;

    // pattern doesn't match so returning false
    if (required && !Pattern.matches(regex, text)) {
        editText.setError(errMsg);
        return false;
    };

    // pattern doesn't match so returning false
    if (!required && !Pattern.matches(regex, text)) {
        editText.setError(errMsg);
        return false;
    };

    return true;
}

// check the input field has any text or not
// return true if it contains text otherwise false
public static boolean hasText(EditText editText) {

    String text = editText.getText().toString().trim();
    editText.setError(null);

    // length 0 means there is no text
    if (text.length() == 0) {
        editText.setError(REQUIRED_MSG);
        return false;
    }

    return true;
}
}

数量类

代码语言:javascript
复制
public class Quantity extends EditText {
public static String maxLength;
public static String maxLengthFront = "4";
public static String regexCustom;
public boolean statusFocused = false;
public boolean allowBlank;
public String decimalPlaces;

String oldText;
Validation validation = new Validation();

public Quantity(Context context) {
    super(context);
}

public Quantity(Context context, AttributeSet attrs) {
    super(context, attrs);
    // --- Additional custom code --
    TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.Quantity);
    final int N = a.getIndexCount();
    for (int i = 0; i < N; ++i) {
        int attr = a.getIndex(i);
        switch (attr) {
        case R.styleable.Quantity_decimalPlaces_quantity:
            decimalPlaces = a.getString(attr);
            // ...do something with delimiter...
            break;
        case R.styleable.Quantity_maxLength_quantity:
            maxLength = "5";
            // ...do something with fancyText...
            doSetMaxLength();
            break;
        case R.styleable.Quantity_allowBlank_quantity:
            allowBlank = a.getBoolean(attr, false);
            // ...do something with fancyText...
            break;
        }
    }
    a.recycle();

    this.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
    this.setKeyListener(DigitsKeyListener.getInstance("1234567890-.,"));

    this.addTextChangedListener(new TextWatcher() {

        public void afterTextChanged(Editable s) {
            if (statusFocused == true) {
                maxLengthFront = "4";
                if (validation.isQuantity(Quantity.this, false)) {
                    // Toast.makeText(getContext(), "Validation True", Toast.LENGTH_SHORT).show();
                } else {
                    // Toast.makeText(getContext(), "Validation False",Toast.LENGTH_SHORT).show();
                    Quantity.this.setText(oldText);
                    Quantity.this.setSelection(Quantity.this.getText().length(), Quantity.this.getText().length());
                }
            } else {
                maxLengthFront = "5";
            }

            validation.QUANTITY_REGEX = "^\\d{0," + maxLengthFront + "}(\\,\\d{0,3})?$";

        }

        public void beforeTextChanged(CharSequence s, int start, int count,int after) {
            oldText = s.toString();
            // Toast.makeText(getContext(), "Before change : " + s, Toast.LENGTH_SHORT).show();
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }
    });

    this.setOnFocusChangeListener(new OnFocusChangeListener() {
        public void onFocusChange(View v, boolean gainFocus) {
            // onFocus
            String s;
            if (gainFocus) {
                maxLengthFront = "4";
                validation.QUANTITY_REGEX = "^\\d{0," + maxLengthFront + "}(\\,\\d{0,3})?$";
                s = Quantity.this.getText().toString().replace(".", "");
                Quantity.this.setText(s);
                statusFocused = true;

            }

            // onBlur
            else {
                maxLengthFront = "5";
                validation.QUANTITY_REGEX = "^\\d{0," + maxLengthFront + "}(\\.\\d{0,3})?$";
                Double number = Double.parseDouble(Quantity.this.getText().toString());
                DecimalFormatSymbols symbol = DecimalFormatSymbols.getInstance();
                symbol.setGroupingSeparator('.');
                symbol.setDecimalSeparator(',');
                DecimalFormat formatter = new DecimalFormat("###,###.###", symbol);
                Quantity.this.setText(formatter.format(number));
                statusFocused = false;
            }
        }
    });
}

public Quantity(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // --- Additional custom code --
}

// @Override
// protected void onTextChanged(CharSequence text, int start,
// int lengthBefore, int lengthAfter) {
// // TODO Auto-generated method stub
// super.onTextChanged(text, start, lengthBefore, lengthAfter);
// Toast.makeText(getContext(), this.getText() + " - " + text.toString(),
// Toast.LENGTH_SHORT).show();
// }

public void doSetMaxLength() {
    InputFilter[] FilterArray = new InputFilter[1];
    FilterArray[0] = new InputFilter.LengthFilter(Integer.parseInt(maxLength, 10));
    this.setFilters(FilterArray);
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23990914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档