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)
处理了我的代码。我对你的答案投了赞成票。谢谢