【问题标题】:Different color for upper/lower case alphabets and digits in textViewtextView 中大写/小写字母和数字的不同颜色
【发布时间】:2016-02-16 12:29:38
【问题描述】:

我的应用程序中有一个 textView,我正在用一个一次性密码填充它,其中包含大写/小写字母和数字。我现在需要为所有三种类型的字符使用不同的颜色以提高可读性。在谷歌中环顾四周,但可以得到很多。谁能指出我正确的方法。会从那里捡起来的。 提前致谢!!

【问题讨论】:

标签: android android-layout android-fragments android-styles


【解决方案1】:

试试这个:

MainActivity.java

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = (TextView) findViewById(R.id.myColoredString);
        String x = tv.getText().toString();
        SpannableStringBuilder builder = new SpannableStringBuilder();

        for(int i = 0; i< x.length();i++){

            //UpperCase : RED
            if(x.charAt(i) >= 65 && x.charAt(i) <= 90) {
                String s = x.charAt(i) + "";
                SpannableString spannableString = new SpannableString(s);
                spannableString.setSpan(new ForegroundColorSpan(Color.RED), 0, s.length(), 0);
                builder.append(spannableString);
            }

            //LowerCase: GREEN
            if(x.charAt(i) >= 97 && x.charAt(i) <= 122) {
                String s = x.charAt(i) + "";
                SpannableString spannableString = new SpannableString(s);
                spannableString.setSpan(new ForegroundColorSpan(Color.GREEN), 0, s.length(), 0);
                builder.append(spannableString);
            }

            //Digits: BLUE
            if(x.charAt(i) >= 48 && x.charAt(i) <= 57) {
                String s = x.charAt(i) + "";
                SpannableString spannableString = new SpannableString(s);
                spannableString.setSpan(new ForegroundColorSpan(Color.BLUE), 0, s.length(), 0);
                builder.append(spannableString);
            }
        }

        tv.setText(builder, TextView.BufferType.SPANNABLE);


    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
    <TextView
       android:id="@+id/myColoredString"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="HeLlo98"
    />
</RelativeLayout>

Refer this link

【讨论】:

    【解决方案2】:

    试试这个答案,

     TextView TV = (TextView)findViewById(R.id.tv_onetime_password);
    String oneTimePass="43434Qe";
    for(int i = 0; i < oneTimePass.length(); i++) {
    
    String myChar=oneTimePass.charAt(i);
    
     Spannable word = new SpannableString(myChar);
    
    //for digits
     if (Character.isLetter(oneTimePass.charAt(i))){
    word.setSpan(new ForegroundColorSpan(Color.WHITE), i,(i+1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
     TV.append(word);
    
    }
    
    //for letters
    else{
    boolean hasUppercase = !myChar.equals(myChar.toLowerCase());
    
    if(hasUppercase){
     word.setSpan(new ForegroundColorSpan(Color.BLUE), i,(i+1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
     TV.append(word);
    }
    
    else {
     word.setSpan(new ForegroundColorSpan(Color.RED), i,(i+1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
     TV.append(word);
    }
    }       
    
    }

    更多参考, Single TextView with multiple colored text

    注意:未测试输出..

    【讨论】:

    • 我有一个类似的用例,很困惑。上面你提到“Character.isLetter()...”是 // 用于数字。但是不是字符的 Character.isLetter() 不是数字吗?你的意思是写“Character.isDigit()”吗?另外,对于大写测试,可以使用 Character.isUpperCase() 而不是布尔值吗?
    【解决方案3】:

    您提到了它的密码字段,因此它不应显示我们输入的任何文本。但是如果你真的想为不同的commination有不同的风格/颜色,那么你可以试试

    1. 首先找出根据您的要求分组的字符(数字、大写和小写)

    2. 使用 Html.fromHtml 方法为每个组设置颜色。

    String string = “大写。一个小写的 1 数字。";

    你也可以试试 Spannable 字符串。

    【讨论】:

    • 它不是密码字段。它是一个 OTP,用户必须阅读并在其他地方输入,所以它必须是可见的
    猜你喜欢
    • 2013-02-04
    • 2016-11-09
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多