设置多个自定义元素MultiAutoCompleteTextView:安卓多个、自定义、元素、MultiAutoCompleteTextView

2023-09-04 07:34:10 作者:少年未老心先老

这是我的$p$pvious后,我能够设置多个元素的 MultiAutoCompleteTextView ,但我没能来包装这些项目具有自定义背景和关闭按钮在该链接的图片。

我能够用单一元素,但对于多这样做,跑出运气。

这是我试过了。

  

//设置文本MultiAutoCompleteTextView

 私人无效setTextSample(字符串联系人姓名){

    最后SpannableStringBuilder SB =新SpannableStringBuilder();
    TextView的电视=(TextView中)LayoutInflater.from(本).inflate(R.layout.textview,NULL);
    tv.setText(联系人姓名);
    BitmapDrawable BD =(BitmapDrawable)convertViewToDrawable(TV);
    bd.setBounds(0,0,bd.getIntrinsicWidth(),bd.getIntrinsicHeight());

    sb.append(CONTACTNAME +,);
    sb.setSpan(新ImageSpan(BD),sb.length() - (contactName.length()+1),
            sb.length() -  1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    mMultiAutoCompleteTextView.setText(某人);
}
 
如何在 思图云平台 中为素材添加自定义动画

  

自定义元素//自动换行

 私有静态对象convertViewToDrawable(查看视图){
  INT规格= MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);
  view.measure(规格,规格);
  view.layout(0,0,view.getMeasuredWidth(),view.getMeasuredHeight());
  位图B = Bitmap.createBitmap(view.getMeasuredWidth(),view.getMeasuredHeight(),
            Bitmap.Config.ARGB_8888);
  帆布C =新的Canvas(B);
  c.translate(-view.getScrollX(),-view.getScrollY());
  view.draw(C);
  view.setDrawingCacheEnabled(真正的);
  位图cacheBmp = view.getDrawingCache();
  位图viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888,真正的);
  view.destroyDrawingCache();
  返回新BitmapDrawable(viewBmp);
}
 

任何帮助是极大的AP preciated。

编辑:

如果我这样做

  mMultiAutoCompleteTextView.setText(mMultiAutoCompleteTextView.getText()的toString()+,+ SB);
 

我收到多个文本,但他们不包裹自定义背景。 没有得到我要去的地方错了。

编辑:

样品中的多种元素会是这个样子

解决方案

试试这个:

 类MyMultiAutoCompleteTextView扩展MultiAutoCompleteTextView {

    公共MyMultiAutoCompleteTextView(上下文的背景下){
        超(上下文);
    }

    @覆盖
    保护无效replaceText(CharSequence的文字){
        Log.d(TAG,replaceText+ text.getClass()++文字);
        super.replaceText(getSpanned(text.toString()));
    }
}

私人跨区getSpanned(字符串名称){
    TextView的电视=(TextView中)LayoutInflater.from(本).inflate(R.layout.test,NULL);
    tv.setText(名称);
    SpannableStringBuilder SB =新SpannableStringBuilder(名称);
    sb.setSpan(新ViewReplacementSpan(电视),0,sb.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    返回某人;
}

类ViewReplacementSpan扩展DynamicDrawableSpan {
    私人视图V;
    私人绘制对象绘制;

    公共ViewReplacementSpan(视图v){
        超(ALIGN_BOTTOM);
        this.v = V;
        INT规格= MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);
        v.measure(规格,规格);
        v.layout(0,0,v.getMeasuredWidth(),v.getMeasuredHeight());
        绘制=新SpanDrawable();
        drawable.setBounds(0,0,v.getMeasuredWidth(),v.getMeasuredHeight());
    }

    @覆盖
    公众可绘制getDrawable(){
        返回绘制;
    }

    类SpanDrawable扩展绘制对象{
        @覆盖
        公共无效画(油画画布){
            canvas.cli preCT(的getBounds());
            v.draw(画布);
        }

        @覆盖
        公共无效setAlpha(INT阿尔法){
        }

        @覆盖
        公共无效setColorFilter(ColorFilter CF){
        }

        @覆盖
        公众诠释getOpacity(){
            返回PixelFormat.TRANSLUCENT;
        }
    }
}
 

在的onCreate()以下测试:

 的LinearLayout LL =新的LinearLayout(本);
ll.setOrientation(LinearLayout.VERTICAL);

MultiAutoCompleteTextView mactv =新MyMultiAutoCompleteTextView(本);
ArrayAdapter<跨区> A =新的ArrayAdapter<跨区>(这一点,android.R.layout.simple_dropdown_item_1line);
的String []名= {简,约翰,玛丽,马};
对于(字符串名称:名){
    a.add(getSpanned(名称));
}

标记生成器标记生成器=新MultiAutoCompleteTextView.CommaTokenizer();
mactv.setTokenizer(分词);
mactv.setAdapter(一);
mactv.setThreshold(1);
SpannableStringBuilder SB =新SpannableStringBuilder();
的for(int i = 0;我2;我++){
    sb.append(tokenizer.terminateToken(a.getItem(我)));
}
mactv.setText(某人);
ll.addView(mactv);

TextView的电视=新的TextView(本);
tv.setGravity(Gravity.CENTER);
tv.setText(试试:简,约翰,玛丽和马克);
tv.setTextSize(32);
ll.addView(电视);
的setContentView(Ⅱ);
 

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 background and close button as in that link picture.

I was able to do the same with single element but for multiple, ran out of luck.

This is what I tried.

// 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, 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, 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);
}

Any help is greatly appreciated.

Edit :

If I do

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

I am getting multiple texts but they are not wrapped with custom background. Not getting where I am going wrong.

Edit :

Sample multiple elements would look something like this

解决方案

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<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);