Java 如何为字符串的特定部分着色

Java 如何为字符串的特定部分着色,java,android,string,Java,Android,String,我有以下自定义适配器: 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; impor

我有以下自定义适配器:

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;
   }
}
package com.test.testing;
导入java.text.DateFormat;
导入java.text.simpleDataFormat;
导入java.util.ArrayList;
导入java.util.Calendar;
导入java.util.Locale;
导入android.app.Activity;
导入android.content.Context;
导入android.graphics.Color;
导入android.graphics.Typeface;
导入android.text.Spannable;
导入android.text.SpannableString;
导入android.text.style.ForegroundColorSpan;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类SetRowsCustomAdapter扩展了ArrayAdapter{
语境;
国际布局资源;
ArrayList数据=新的ArrayList();
DateFormat df=新的SimpleDataFormat(“eeee,lll d”,Locale.US);
字符串[]挂起日期={
“1月20日,星期一”,
“1月31日,星期五”,
};
公共SetRowsCustomAdapter(上下文上下文、int-layoutResourceId、ArrayList数据){
超级(上下文、布局资源ID、数据);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
这个数据=数据;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
ImageHolder=null;
if(行==null)
{
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
支架=新的图像支架();
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=(ImageHolder)行。getTag();
}
SetRows myImage=data.get(位置);
int inReason=myImage.name.indexOf(“,”);//myImage.name与suspendedDates[]是同一字符串;
字符串strR=myImage.name.substring(0,原因);
Spannable WordToSpan=新SpannableString(strR);
WordToSpan.setSpan(新的ForegroundColorSpan(Color.parseColor(#4787ED))、0、WordToSpan.length()、Spannable.SPAN_EXCLUSIVE#u EXCLUSIVE);
String strRNext=myImage.name.substring(原因:myImage.name.length());
Spannable wordtospan 1=新SpannableString(strnext);
wordtospan 1.setSpan(新的ForegroundColorSpan(R.color.dateholiday),0,wordtospan 1.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
字符串strConcat=WordToSpan.toString()+WordToSpan.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())){
支架.imgIcon.setImageResource(R.可绘制.校准压力);
}
否则{
holder.imgIcon.setImageResource(R.drawable.calicon);
}*/
返回行;
}
静态类图像保持器
{
ImageView imgIcon;
TextView-txtTitle;
TextView-txtID;
TextView-txtDate;
}
}
我正在使用
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);
希望这有帮助


问候

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

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

holder.txtTitle.setText(WordToSpan + WordToSpan1);

这给了我一个+错误,
运算符+对于参数类型android.text.Spannable,android.text.Spannable是未定义的
好,您需要组合Spannable,否则(可能创建一个带多个span元素的单个Spannable字符串)。我的答案的重要部分是不要进行toString()转换。您可以使用SpanAbleStringBuilder()创建原始的SpanAbleString。
TextUtils.concat(WordToSpan,WordToSpan1)
worked:)我对您的答案投了赞成票。谢谢我正在尝试合并两个。如果我可以问一下,我的有什么问题?当你在这里连接字符串时,你传递的是一个字符串,而不是一个可spannable对象“string strConcat=WordToSpan.toString()+WordToSpan 1.toString();”,因为这是你正在使用的,所以你丢失了一个可更改颜色的“spannable”对象,所以你只设置了一个常规的连接字符串,如果要将它们组合在一起,请先连接,然后添加spannable属性,并确保在setText方法上传递spannable,而不是字符串。
TextUtils.concat(WordToSpan,WordToSpan1)
处理了我的代码。我对你的答案投了赞成票。谢谢