1. ホーム
  2. android

[解決済み] コンタクトバブル EditText

2023-03-24 21:32:44

質問

コンタクトバブルを作成しようとしています。 MultiAutoCompleteTextView にコンタクトバブルを作成しようとしています。以下はスクリーンショットです。

.

を拡張してみました。 DynamicDrawableSpan クラスを拡張して、テキストのスパンの背景にスパン描画可能なオブジェクトを表示するようにしました。

public class BubbleSpan extends DynamicDrawableSpan {
  private Context c;

  public BubbleSpan(Context context) {
    super();
    c = context;
  }

  @Override
  public Drawable getDrawable() {
    Resources res = c.getResources();
    Drawable d = res.getDrawable(R.drawable.oval);
    d.setBounds(0, 0, 100, 20);
    return d;
  }
}

私のoval.xmlのdrawableはこのように定義されているところです。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
  <solid android:color="#352765"/>
  <padding android:left="7dp" android:top="7dp"
    android:right="7dp" android:bottom="7dp" />
  <corners android:radius="6dp" />
</shape>

私のActivityクラスでは MulitAutoCompleteTextView を持つActivityクラスで、バブルスパンをこのように設定します。

final Editable e = tv.getEditableText();
final SpannableStringBuilder sb = new SpannableStringBuilder();
sb.append("some sample text");
sb.setSpan(new BubbleSpan(getApplicationContext()), 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
e.append(sb); 

しかし、文字列の最初の6文字の後ろに楕円形が表示されるのではなく、文字は表示されず、背景には楕円形の描画可能なものはありません。

BubbleSpanのgetDrawable()メソッドを変更して、シェイプのdrawableの代わりに.pngを使用するようにした場合。

public Drawable getDrawable() {
  Resources res = c.getResources();
  Drawable d = res.getDrawable(android.R.drawable.bottom_bar);
  d.setBounds(0, 0, 100, 20);
  return d;
}

すると、.pngは表示されるのですが、spanの一部である文字列の文字が表示されないのです。 どうすれば、spanの文字はフォアグラウンドに表示され、カスタムシェイプのdrawableはバックグラウンドに表示されるようになるのでしょうか?

を使用することも試みました。 ImageSpan をサブクラス化する代わりに DynamicDrawableSpan のサブクラスを作成しましたが、失敗しました。

どのように解決するのですか?

chrishさん、ありがとうございました。 以下は、私が行った方法です。

final SpannableStringBuilder sb = new SpannableStringBuilder();
TextView tv = createContactTextView(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);
to_input.setText(sb);

public TextView createContactTextView(String text){
  //creating textview dynamically
  TextView tv = new TextView(this);
  tv.setText(text);
  tv.setTextSize(20);
  tv.setBackgroundResource(R.drawable.oval);
  tv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_clear_search_api_holo_light, 0);
  return tv;
}

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

}