Google+アプリでの実装方法に似た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のドロアブルは次のように定義されています:
<?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>
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()メソッドを変更して、シェイプドロウアブルではなく.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は表示されますが、スパンの一部である文字列内の文字は表示されません。スパン内の文字がフォアグラウンドに表示され、カスタムシェイプのドロアブルがバックグラウンドに表示されるようにするにはどうすればよいですか
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);
}
ここにあなたのための完全なソリューションがあります
//creating textview dynamicalyy
TextView textView=new TextView(context);
textview.setText("Lauren amos");
textview.setbackgroundResource(r.color.urovalshape);
textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.icon_cross, 0);
BitmapDrawable dd = (BitmapDrawable) SmsUtil.getDrawableFromTExtView(textView);
edittext.settext(addSmily(dd));
//convert image to spannableString
public SpannableStringBuilder addSmily(Drawable dd) {
dd.setBounds(0, 0, dd.getIntrinsicWidth(),dd.getIntrinsicHeight());
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(":-)");
builder.setSpan(new ImageSpan(dd), builder.length() - ":-)".length(),builder.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return builder;
}
//convert view to drawable
public static Object getDrawableFromTExtView(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.getWidth(), view.getHeight(),
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);
}
Spannble を使用する場合は、完全なプロジェクトファイルを次に示します。
私はあなたが探しているものを行うライブラリを手に入れました:
ここでクイックスタート:
ChipViewをレイアウトに追加するか、プログラムで作成します。
<com.plumillonforge.Android.chipview.ChipView
Android:id="@+id/chipview"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
抽象チップとクリックリスナーを拡張するデータのリストで初期化します(必要な場合)。
List<Chip> chipList = new ArrayList<>();
chipList.add(new Tag("Lorem"));
chipList.add(new Tag("Ipsum dolor"));
chipList.add(new Tag("Sit amet"));
chipList.add(new Tag("Consectetur"));
chipList.add(new Tag("adipiscing elit"));
ChipView chipDefault = (ChipView) findViewById(R.id.chipview);
chipDefault.setChipList(chipList);
chipDefault.setOnChipClickListener(new OnChipClickListener() {
@Override
public void onChipClick(Chip chip) {
// Action here !
}
});
デフォルトのChipViewは次のようにレンダリングされます。
ただし、全体からチップレベルまで自由にカスタマイズできます。
これはMultiAutocompleteではありませんが、それをまねることができます(実際にそのように使用しています)