Setting multiple custom elements to MultiAutoCompleteTextView : Android

前端 未结 2 1837
庸人自扰
庸人自扰 2020-12-15 11:48

Continuing from my previous post, I was able to set multiple elements to the MultiAutoCompleteTextView but I was not able to wrap those items with custom backg

2条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-15 12:42

    try this:

    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), 0, 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, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
            drawable = new SpanDrawable();
            drawable.setBounds(0, 0, v.getMeasuredWidth(), 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;
            }
        }
    }
    

    test it with the following in onCreate():

    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.VERTICAL);
    
    MultiAutoCompleteTextView mactv = new MyMultiAutoCompleteTextView(this);
    ArrayAdapter a = new ArrayAdapter(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);
    

提交回复
热议问题