首页 > 代码库 > android中TextView 添加ClickableSpan后点击选中文字背景问题

android中TextView 添加ClickableSpan后点击选中文字背景问题

TextView中的setHighlightColor(int color)用于设置选中文字背景色高亮显示。

 比如以下:

public class MainActivity extends ActionBarActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        FrameLayout frameLayout = new FrameLayout(this);        setContentView(frameLayout);        frameLayout.setId(R.id.container);        if (savedInstanceState == null) {            getSupportFragmentManager().beginTransaction()                    .add(R.id.container, new PlaceholderFragment())                    .commit();        }    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        //noinspection SimplifiableIfStatement        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }    /**     * A placeholder fragment containing a simple view.     */    public static class PlaceholderFragment extends Fragment {        public PlaceholderFragment() {        }        @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container,                                 Bundle savedInstanceState) {            View rootView = inflater.inflate(R.layout.fragment_main, container, false);            return rootView;        }        @Override        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {            super.onViewCreated(view, savedInstanceState);            TextView textView = (TextView) view.findViewById(R.id.textview);            String str = "Click me!";            String txt = str + "Hello world!";            SpannableString spannableString = new SpannableString(txt);            ClickableSpan clickableSpan = new ClickableSpan() {                @Override                public void onClick(View widget) {                    //Do something.                    if(isAdded()) {                        Toast.makeText(getActivity(), "You have clicked!", Toast.LENGTH_LONG).show();//                        avoidHintColor(widget);                    }                }                @Override                public void updateDrawState(@NonNull TextPaint ds) {                    super.updateDrawState(ds);                    ds.setColor(getResources().getColor(android.R.color.holo_red_dark));                    ds.setUnderlineText(false);                    ds.clearShadowLayer();                }            };            spannableString.setSpan(clickableSpan,0,str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);            textView.setText(spannableString);            textView.setMovementMethod(LinkMovementMethod.getInstance());        }        private void avoidHintColor(View view){            if(view instanceof TextView)                ((TextView)view).setHighlightColor(getResources().getColor(android.R.color.transparent));        }    }}        

 

会出现文字选中出现淡绿色的背景色现象。如下图1.1。ds.setColor()设定的是span超链接的文本颜色,而不是点击后的颜色,点击后的背景颜色(HighLightColor)属于TextView的属性,Android4.0以上默认是淡绿色,低版本的是黄色。

   解决方法就是通过

((TextView)view).setHighlightColor(getResources().getColor(android.R.color.transparent));方法重新设置文字背景为透明色。

修改后的结果如图1.2。

图1.1:

技术分享

 

 

图1.2:

技术分享

 

android中TextView 添加ClickableSpan后点击选中文字背景问题