将多个自定义元素设置为MultiAutoCompleteTextView:Android

前端之家收集整理的这篇文章主要介绍了将多个自定义元素设置为MultiAutoCompleteTextView:Android前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
从我的 previous帖子继续,我能够为MultiAutoCompleteTextView设置多个元素,但是我无法用自定义背景和关闭按钮包装那些项目,就像链接图片一样.

我能够用单个元素做同样的事情,但是对于多个元素,运气不好.

这是我试过的.

// set text to MultiAutoCompleteTextView

  1. private void setTextSample(String contactName) {
  2.  
  3. final SpannableStringBuilder sb = new SpannableStringBuilder();
  4. TextView tv = (TextView) LayoutInflater.from(this).inflate(R.layout.textview,null);
  5. tv.setText(contactName);
  6. BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
  7. bd.setBounds(0,bd.getIntrinsicWidth(),bd.getIntrinsicHeight());
  8.  
  9. sb.append(contactName + ",");
  10. sb.setSpan(new ImageSpan(bd),sb.length()-(contactName.length()+1),sb.length()-1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  11.  
  12. mMultiAutoCompleteTextView.setText(sb);
  13. }

// wrap text with custom elements

  1. private static Object convertViewToDrawable(View view) {
  2. int spec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);
  3. view.measure(spec,spec);
  4. view.layout(0,view.getMeasuredWidth(),view.getMeasuredHeight());
  5. Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(),view.getMeasuredHeight(),Bitmap.Config.ARGB_8888);
  6. Canvas c = new Canvas(b);
  7. c.translate(-view.getScrollX(),-view.getScrollY());
  8. view.draw(c);
  9. view.setDrawingCacheEnabled(true);
  10. Bitmap cacheBmp = view.getDrawingCache();
  11. Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888,true);
  12. view.destroyDrawingCache();
  13. return new BitmapDrawable(viewBmp);
  14. }

任何帮助是极大的赞赏.

编辑:

如果我做

  1. mMultiAutoCompleteTextView.setText(mMultiAutoCompleteTextView.getText().toString()+","+sb);

我收到了多个文本,但它们没有自定义背景.
没有得到我错的地方.

编辑:

多个元素的示例看起来像这样

解决方法

试试这个:
  1. class MyMultiAutoCompleteTextView extends MultiAutoCompleteTextView {
  2.  
  3. public MyMultiAutoCompleteTextView(Context context) {
  4. super(context);
  5. }
  6.  
  7. @Override
  8. protected void replaceText(CharSequence text) {
  9. Log.d(TAG,"replaceText " + text.getClass() + " " + text);
  10. super.replaceText(getSpanned(text.toString()));
  11. }
  12. }
  13.  
  14. private Spanned getSpanned(String name) {
  15. TextView tv = (TextView) LayoutInflater.from(this).inflate(R.layout.test,null);
  16. tv.setText(name);
  17. SpannableStringBuilder sb = new SpannableStringBuilder(name);
  18. sb.setSpan(new ViewReplacementSpan(tv),sb.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  19. return sb;
  20. }
  21.  
  22. class ViewReplacementSpan extends DynamicDrawableSpan {
  23. private View v;
  24. private Drawable drawable;
  25.  
  26. public ViewReplacementSpan(View v) {
  27. super(ALIGN_BOTTOM);
  28. this.v = v;
  29. int spec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);
  30. v.measure(spec,spec);
  31. v.layout(0,v.getMeasuredWidth(),v.getMeasuredHeight());
  32. drawable = new SpanDrawable();
  33. drawable.setBounds(0,v.getMeasuredHeight());
  34. }
  35.  
  36. @Override
  37. public Drawable getDrawable() {
  38. return drawable;
  39. }
  40.  
  41. class SpanDrawable extends Drawable {
  42. @Override
  43. public void draw(Canvas canvas) {
  44. canvas.clipRect(getBounds());
  45. v.draw(canvas);
  46. }
  47.  
  48. @Override
  49. public void setAlpha(int alpha) {
  50. }
  51.  
  52. @Override
  53. public void setColorFilter(ColorFilter cf) {
  54. }
  55.  
  56. @Override
  57. public int getOpacity() {
  58. return PixelFormat.TRANSLUCENT;
  59. }
  60. }
  61. }

在onCreate()中使用以下内容对其进行测试:

  1. LinearLayout ll = new LinearLayout(this);
  2. ll.setOrientation(LinearLayout.VERTICAL);
  3.  
  4. MultiAutoCompleteTextView mactv = new MyMultiAutoCompleteTextView(this);
  5. ArrayAdapter<Spanned> a = new ArrayAdapter<Spanned>(this,android.R.layout.simple_dropdown_item_1line);
  6. String[] names = { "Jane","John","Mary","Mark" };
  7. for (String name: names) {
  8. a.add(getSpanned(name));
  9. }
  10.  
  11. Tokenizer tokenizer = new MultiAutoCompleteTextView.CommaTokenizer();
  12. mactv.setTokenizer(tokenizer);
  13. mactv.setAdapter(a);
  14. mactv.setThreshold(1);
  15. SpannableStringBuilder sb = new SpannableStringBuilder();
  16. for (int i = 0; i < 2; i++) {
  17. sb.append(tokenizer.terminateToken(a.getItem(i)));
  18. }
  19. mactv.setText(sb);
  20. ll.addView(mactv);
  21.  
  22. TextView tv = new TextView(this);
  23. tv.setGravity(Gravity.CENTER);
  24. tv.setText("try: Jane,John,Mary or Mark");
  25. tv.setTextSize(32);
  26. ll.addView(tv);
  27. setContentView(ll);

猜你在找的Android相关文章