【问题标题】:How to color specific part of a String如何为字符串的特定部分着色
【发布时间】:2014-01-07 00:10:34
【问题描述】:

我有以下 CustomAdapter:

package com.test.testing;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class SetRowsCustomAdapter extends ArrayAdapter<SetRows> {
    Context context;
   int layoutResourceId;
   ArrayList<SetRows> data=new ArrayList<SetRows>();
   DateFormat df = new SimpleDateFormat("EEEEE, LLLL d", Locale.US);
   String[] suspendedDates = {
            "Monday, January 20",
            "Friday, January 31",
    };
   public SetRowsCustomAdapter(Context context, int layoutResourceId, ArrayList<SetRows> data) {
       super(context, layoutResourceId, data);
       this.layoutResourceId = layoutResourceId;
       this.context = context;
       this.data = data;
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
       View row = convertView;
       ImageHolder holder = null;

       if(row == null)
       {
           LayoutInflater inflater = ((Activity)context).getLayoutInflater();
           row = inflater.inflate(layoutResourceId, parent, false);

           holder = new ImageHolder();
           holder.txtTitle = (TextView)row.findViewById(R.id.tvDateVal);
           //holder.txtTitle.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/robm.ttf"));
           holder.imgIcon = (ImageView)row.findViewById(R.id.ivIcon0);
           holder.txtDate = (TextView)row.findViewById(R.id.tvDateNum);
           holder.txtID = (TextView)row.findViewById(R.id.tvReasonVal);
           //holder.txtID.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/robm.ttf"));
           row.setTag(holder);
       }
       else
       {
           holder = (ImageHolder)row.getTag();
       }

       SetRows myImage = data.get(position);
       int inReason = myImage.name.indexOf(","); //myImage.name is the same string as suspendedDates[];
        String strR = myImage.name.substring(0, inReason);
        Spannable WordToSpan = new SpannableString(strR);
        WordToSpan.setSpan(new ForegroundColorSpan(Color.parseColor("#4787ED")), 0, WordToSpan.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        String strRNext = myImage.name.substring(inReason, myImage.name.length());
        Spannable WordToSpan1 = new SpannableString(strRNext);
    WordToSpan1.setSpan(new ForegroundColorSpan(R.color.dateholiday), 0, WordToSpan1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        String strConcat = WordToSpan.toString() + WordToSpan1.toString();

       holder.txtTitle.setText(strConcat);//myImage.name);
       holder.txtID.setText(myImage.id);
       holder.txtDate.setText(myImage.date);
       int outImage=myImage.image;
       /*if (myImage.name.contains(df.format(Calendar.getInstance(Locale.US).getTime()))) {
           holder.imgIcon.setImageResource(R.drawable.caliconpressed);
       }
       else {
           holder.imgIcon.setImageResource(R.drawable.calicon);
       }*/
      return row;

   }

   static class ImageHolder
   {
       ImageView imgIcon;
       TextView txtTitle;
       TextView txtID;
       TextView txtDate;
   }
}

我正在使用Spannable 设置字符串的单独颜色。它应该产生这样的东西:

但它仍然显示这个:

有人知道如何编辑适配器以实现我想要做的事情吗?

【问题讨论】:

    标签: java android string


    【解决方案1】:

    不要将 Spannable 转换为字符串。 (即不要这样做:WordToSpan.toString()

    相反,将 Spannable 直接设置到您的支架中,如下所示:

    holder.txtTitle.setText(WordToSpan + WordToSpan1);
    

    【讨论】:

    • 它给了我一个错误的+,The operator + is undefined for the argument type(s) android.text.Spannable, android.text.Spannable
    • 好的,否则你需要组合 Spannable (也许你创建一个单一的 spannable 字符串,带有多个 span 元素)。我的答案的重要部分是不要进行 toString() 转换。
    • 您可以使用 SpannableStringBuilder (developer.android.com/reference/android/text/…) 创建您的原始 SpannableString。
    • TextUtils.concat(WordToSpan, WordToSpan1) 工作:) 我赞成你的回答。谢谢!
    【解决方案2】:

    使用spannable字符串如下:

    SpannableString ss = new SpannableString("hey #abc how are you.");
    ss.setSpan(new ForegroundColorSpan(Color.RED), 4, 9, 0);
    //Now just add the SpannableString to your textview
    textView.setText(ss);
    

    希望对您有所帮助。

    问候!

    【讨论】:

    • 我正在尝试合并两个。如果我可以问,我的有什么问题?
    • 当你在这里连接它们时,你传递的是一个字符串,而不是一个可扩展的对象“String strConcat = WordToSpan.toString() + WordToSpan1.toString();”,因为这就是你正在使用的你丢失了“spannable”对象是一个改变颜色的对象,所以你只设置一个常规的连接字符串,如果你想组合它们你首先连接,然后添加spannable属性并确保在setText方法上传递spannable,不是字符串。
    • TextUtils.concat(WordToSpan, WordToSpan1) 使用我的代码。我赞成你的回答。谢谢。
    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多