在项目里面最开始使用了系统提供的TextView,但是后来更改业务需求,需要setText()把一个xml里面定义的某些字符转换为图片显示。然后我自己实现了一个类来进行转换把String转换为SpannableStringBuilder。
最后在调用的时候,我发现这是个坑也就是说,我需要整个应用,所有涉及为TextView都要实现这个功能。
解决方案我目前想到的有两种方案。
1.继承TexView,覆盖setText()函数,这样我需要把所有XML布局文件以及JAVA源文件里面的TextView都改成我继承的那个控件,项目太大,文件太多,这是一个坑,另外TextView的setText函数是final的,也就是说调用的时候必须使用另外一个函数而不是setText进行设置。
2.使用系统原有的控件,在调用前先转换String为SpannableStringBuilder,比如mTextView.setText(TextUtils.convertToSpannableStringBuilder(contentString));这样也比较麻烦,每次设置控件的值前都要调用这个,很多时候容易忘记。工作量相对前面的小点,但是也很麻烦,关键是项目太大,文件太多。
3.更想到
现在我希望能有一个简单的解决方案,哪位大神有好的办法,尽量改动少些来实现这个功能。androidtextview控件

解决方案 »

  1.   

    前面的3没写完,如下
    把控件和内容传入一个函数进行设置,工作量同2
    public void setFace(View view,String content){
    if(View instanceof TextView){
    (TexView)(view).setText(TextUtils.convertToSpannableStringBuilder(contentString));
    }else if(View instanceof EditText){
    (EditText)(view).setText(TextUtils.convertToSpannableStringBuilder(contentString));
    }else{
    }
    }求建议啊
      

  2.   

    方案1也可以的:
    1. 自定义TextView,比如叫EmojiTextView
    2. 重写setText (CharSequence text, TextView.BufferType type)
       虽然setText (CharSequence text)等是final的,但是它其实调用的是上面这个非final方法
    3. 只需要在res里面找就可以了,代码里面可以仍然使用TextView,除非代码里面有“new TextView”这样的东西,搜索"<TextView"替换成"<com.yourpackage.EmojiTextView"就行了