适用于Android的密码字段中的更大(或自定义)项目符号

时间:2016-12-26 13:52:15

标签: android fonts

我有EditText有密码输入。我想要实现的是为密码点设置一个更大的符号。输入textSize属性是18sp(它应该保持这种方式,例如我不想改变文本大小本身),我希望子弹为22 sp。我试过的是:

用大圆圈符号覆盖转换:

public CharSequence getTransformation(CharSequence source, View view) {
        PasswordTransformationMethod mt = PasswordTransformationMethod.getInstance();
        Field dotField;
        try {
            dotField = PasswordTransformationMethod.class.getDeclaredField("DOT");
            dotField.setAccessible(true);
            dotField.set(null,'\u2b24'); // big circle.. not found in android fonts, uh-oh.
            return mt.getTransformation(source,view);

        } catch (Exception e) {
            e.printStackTrace();
            return super.getTransformation(source,view);
        }
    }

但是,Android字体中缺少有问题的符号。

要解决此问题,我尝试为edittext设置自定义SpannableFactory:

@Override
    public Spannable newSpannable(CharSequence src) {
        String masked = "", unmasked = "";
        for (int i = 0; i < src.length(); i++) {
            if (src.charAt(i) == DOT) {
                masked += src.charAt(i);
            } else {
                unmasked += src.charAt(i);
            }
        }
        debug("Masked: "+ masked+ "; unmasked: " + unmasked);
        SpannableStringBuilder ssb = new SpannableStringBuilder(masked + unmasked);
        Typeface customFont = null;
        try {
            customFont = Typeface.createFromAsset(context.getAssets(), "fonts/NotoSansSymbols-Regular.ttf");
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (customFont != null) {
            ssb.setSpan(new CustomTypefaceSpan(customFont),
                    0, masked.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            );
        }
        return ssb;
  }

但这似乎不起作用(debug()调用被忽略,所以我假设这个代码永远不会被执行),所以我没有尝试设置StyleSpan来代替抛出文本大小而不改变符号

字体本身就存在,并且已加载,我可以为EditText设置它,但如果我这样做,显然输入字体也会改变,这是禁止的。

TL; DR:

是否有任何方法可以为EditText的部分文本设置自定义字体,或者添加具有默认符号缺失的字体,同时保留其他符号的原始字体,或者增加其大小密码输入点?

0 个答案:

没有答案