从我的
previous帖子继续,我能够为MultiAutoCompleteTextView设置多个元素,但是我无法用自定义背景和关闭按钮包装那些项目,就像链接图片一样.
我能够用单个元素做同样的事情,但是对于多个元素,运气不好.
这是我试过的.
// set text to MultiAutoCompleteTextView
- private void setTextSample(String contactName) {
- final SpannableStringBuilder sb = new SpannableStringBuilder();
- TextView tv = (TextView) LayoutInflater.from(this).inflate(R.layout.textview,null);
- tv.setText(contactName);
- BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
- bd.setBounds(0,bd.getIntrinsicWidth(),bd.getIntrinsicHeight());
- sb.append(contactName + ",");
- sb.setSpan(new ImageSpan(bd),sb.length()-(contactName.length()+1),sb.length()-1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- mMultiAutoCompleteTextView.setText(sb);
- }
// wrap text with custom elements
- private static Object convertViewToDrawable(View view) {
- int spec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);
- view.measure(spec,spec);
- view.layout(0,view.getMeasuredWidth(),view.getMeasuredHeight());
- Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(),view.getMeasuredHeight(),Bitmap.Config.ARGB_8888);
- Canvas c = new Canvas(b);
- c.translate(-view.getScrollX(),-view.getScrollY());
- view.draw(c);
- view.setDrawingCacheEnabled(true);
- Bitmap cacheBmp = view.getDrawingCache();
- Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888,true);
- view.destroyDrawingCache();
- return new BitmapDrawable(viewBmp);
- }
任何帮助是极大的赞赏.
编辑:
如果我做
- mMultiAutoCompleteTextView.setText(mMultiAutoCompleteTextView.getText().toString()+","+sb);
我收到了多个文本,但它们没有自定义背景.
没有得到我错的地方.
编辑:
多个元素的示例看起来像这样
解决方法
试试这个:
- class MyMultiAutoCompleteTextView extends MultiAutoCompleteTextView {
- public MyMultiAutoCompleteTextView(Context context) {
- super(context);
- }
- @Override
- protected void replaceText(CharSequence text) {
- Log.d(TAG,"replaceText " + text.getClass() + " " + text);
- super.replaceText(getSpanned(text.toString()));
- }
- }
- private Spanned getSpanned(String name) {
- TextView tv = (TextView) LayoutInflater.from(this).inflate(R.layout.test,null);
- tv.setText(name);
- SpannableStringBuilder sb = new SpannableStringBuilder(name);
- sb.setSpan(new ViewReplacementSpan(tv),sb.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- return sb;
- }
- class ViewReplacementSpan extends DynamicDrawableSpan {
- private View v;
- private Drawable drawable;
- public ViewReplacementSpan(View v) {
- super(ALIGN_BOTTOM);
- this.v = v;
- int spec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);
- v.measure(spec,spec);
- v.layout(0,v.getMeasuredWidth(),v.getMeasuredHeight());
- drawable = new SpanDrawable();
- drawable.setBounds(0,v.getMeasuredHeight());
- }
- @Override
- public Drawable getDrawable() {
- return drawable;
- }
- class SpanDrawable extends Drawable {
- @Override
- public void draw(Canvas canvas) {
- canvas.clipRect(getBounds());
- v.draw(canvas);
- }
- @Override
- public void setAlpha(int alpha) {
- }
- @Override
- public void setColorFilter(ColorFilter cf) {
- }
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
- }
- }
在onCreate()中使用以下内容对其进行测试:
- LinearLayout ll = new LinearLayout(this);
- ll.setOrientation(LinearLayout.VERTICAL);
- MultiAutoCompleteTextView mactv = new MyMultiAutoCompleteTextView(this);
- ArrayAdapter<Spanned> a = new ArrayAdapter<Spanned>(this,android.R.layout.simple_dropdown_item_1line);
- String[] names = { "Jane","John","Mary","Mark" };
- for (String name: names) {
- a.add(getSpanned(name));
- }
- Tokenizer tokenizer = new MultiAutoCompleteTextView.CommaTokenizer();
- mactv.setTokenizer(tokenizer);
- mactv.setAdapter(a);
- mactv.setThreshold(1);
- SpannableStringBuilder sb = new SpannableStringBuilder();
- for (int i = 0; i < 2; i++) {
- sb.append(tokenizer.terminateToken(a.getItem(i)));
- }
- mactv.setText(sb);
- ll.addView(mactv);
- TextView tv = new TextView(this);
- tv.setGravity(Gravity.CENTER);
- tv.setText("try: Jane,John,Mary or Mark");
- tv.setTextSize(32);
- ll.addView(tv);
- setContentView(ll);