android - 我怎样才能创建效果隐藏数字信用卡除了最后 3 个数字

标签 android

我有一个问题,我需要一个带有验证的 editText 和一个隐藏信用卡号码的效果,除了最后 3 个号码..

我有面具并且工作正常,但我需要显示最后 3 个数字。

如何创建这种效果?

enter image description here

  <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/creditCard"
        android:layout_below="@+id/CVV"
        android:inputType="number"
        android:digits=" 1234567890"
        android:maxLength="16"
        android:layout_alignParentStart="true" />

TarjetasBancarias 类

public class TarjetasBancarias extends AppCompatActivity {
    String a;
    int keyDel;
private EditText creditCard;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tarjetas_bancarias);

    creditCard  = (EditText)findViewById(R.id.creditCard);
    creditCard.addTextChangedListener(new CreditCardNumberFormattingTextWatcher());
}

CreditCardNumberFormattingTextWatcher 类

public static class CreditCardNumberFormattingTextWatcher implements TextWatcher {

    private boolean lock;

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

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        if (lock || s.length() > 16) {
            return;
        }
        lock = true;
        for (int i = 4; i < s.length(); i += 5) {
            s.insert(i, "*");
            if (s.toString().charAt(i) != ' ') {
                s.insert(i, " ");
            }
        }
        lock = false;
    }
}

最佳答案

我使用 PasswordCharSequence 解决了我的问题并应用了一个掩码

public class TarjetasBancarias extends AppCompatActivity {

private EditText creditCard;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tarjetas_bancarias);

    creditCard  = (EditText)findViewById(R.id.creditCard);
    creditCard.setTransformationMethod(new MyPasswordTransformationMethod());
     creditCard.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            boolean flag = true;
            String eachBlock[] = creditCard.getText().toString().split("-");
            for (int i = 0; i < eachBlock.length; i++) {
                if (eachBlock[i].length() > 4) {
                    flag = false;
                }
            }
            if (flag) {

                creditCard.setOnKeyListener(new View.OnKeyListener() {

                    @Override
                    public boolean onKey(View v, int keyCode, KeyEvent event) {

                        if (keyCode == KeyEvent.KEYCODE_DEL)
                            keyDel = 1;
                        return false;
                    }
                });

                if (keyDel == 0) {

                    if (((creditCard.getText().length() + 1) % 5) == 0) {

                        if (creditCard.getText().toString().split("-").length <= 3) {
                            creditCard.setText(creditCard.getText() + "-");
                            creditCard.setSelection(creditCard.getText().length());
                        }
                    }
                    a = creditCard.getText().toString();
                } else {
                    a = creditCard.getText().toString();
                    keyDel = 0;
                }

            } else {
                creditCard.setText(a);
            }

        }

        @Override
        public void afterTextChanged(Editable s) {

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

    });

}


public static class MyPasswordTransformationMethod extends PasswordTransformationMethod {
    @Override
    public CharSequence getTransformation(CharSequence source, View view) {
        return new PasswordCharSequence(source);
    }

    private class PasswordCharSequence implements CharSequence {
        private CharSequence mSource;
        public PasswordCharSequence(CharSequence source) {
            mSource = source;
        }
        public char charAt(int index) {
         char caracter;
           switch (index)
            {
                case 4:
                    caracter = ' ';
                    break;
                case 9:
                    caracter = ' ';
                    break;
                case 14:
                    caracter = ' ';
                    break;
                default:
                    if(index < 15)
                        return '*';
                    else
                        caracter = mSource.charAt(index);
                    break;



            }


            return caracter;
        }
        public int length() {
            return mSource.length();
        }
        public CharSequence subSequence(int start, int end) {
            return mSource.subSequence(start, end); 
        }
    }
};}

enter image description here

关于android - 我怎样才能创建效果隐藏数字信用卡除了最后 3 个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33722508/

相关文章:

android - 通过js在WebView中获取位置

android - 如何使不规则形状的组件可点击?安卓

java - 将应用程序从服务返回到前台

java - 星期几的Android日历问题

java - Android 项目和 Android APP 上的 Jar Lib

iphone - 使用 Plone 对移动设备上的用户进行身份验证

java - 如何正确使用包含 Fragment 的 Activity?

android - Android 中具有大量数据后异步任务完成的 Ui 更新最佳实践

android 菜单项不显示图标?

java - 如何创建三个简单的自定义进度View?