Bubble EditText에 문의
MultiAutoCompleteTextView
Google+ 앱에서 구현되는 방식 과 유사한 방식으로 연락처 풍선을 만들려고합니다 . 아래는 스크린 샷입니다.
.
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>
이있는 Activity 클래스에서 MulitAutoCompleteTextView
다음과 같이 버블 스팬을 설정합니다.
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 자 뒤에 타원형 모양이 표시되는 대신 문자가 표시되지 않고 배경에 타원형 드로어 블이 없습니다.
모양 드로어 블 대신 .png를 사용하도록 BubbleSpan의 getDrawable () 메서드를 변경하는 경우 :
public Drawable getDrawable() {
Resources res = c.getResources();
Drawable d = res.getDrawable(android.R.drawable.bottom_bar);
d.setBounds(0, 0, 100, 20);
return d;
}
Then the .png will show up but the characters in the string that are a part of the span will not show up. How can I make it so that the characters in the span are displayed in the foreground, meanwhile a custom shape drawable gets displayed in the background?
I attempted to also use an ImageSpan
instead of subclassing DynamicDrawableSpan
but was unsuccessful.
Thanks @chrish for all the help. So here is how i did it:
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);
}
Here is a complete Solution for you
//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);
}
Here is the complete project file ,if any of you want to use Spannble
I got a library which does what you're looking for with :
- Default or fully customizable (you can even use your own layout)
- Multiline support
- Click listener
Here a quickstart :
Add ChipView to your layout or create it programmatically :
<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는 아니지만 그것을 모방 할 수 있습니다 (실제로는 그렇게 사용하고 있습니다)
참고 URL : https://stackoverflow.com/questions/10812316/contact-bubble-edittext
'Programing' 카테고리의 다른 글
Maven 종속성에서 "번들"유형의 의미는 무엇입니까? (0) | 2020.09.12 |
---|---|
JVM 프로그래밍 언어 만들기 (0) | 2020.09.12 |
CI 서버 비교? (0) | 2020.09.12 |
파이썬 클래스 상속에서 독 스트링 상속 (0) | 2020.09.12 |
IPv6 앱 스토어 거부 (0) | 2020.09.12 |