Может ли кто-нибудь указать мне в правильном направлении, как делать эти пузыри или метки в EditText, что-то вроде тех, которые вы видите, когда хотите что-то создать в Stream для Google+, когда вы добавляете круг или контакт? Прямоугольник - это автоматический полный текст.
Ярлыки или пузыри Android в EditText
Ответ 1
То, что вы показываете, - это то же поведение, что и приложение для акций SMS. Найдите код здесь, чтобы узнать, как это делается.
EDIT:
Код должен находиться в platform_packages_apps_mms. Взгляните на класс RecipientsEditor.
Ответ 2
Я построил TokenAutoComplete на github, чтобы решить подобную проблему, и он должен работать и на вас. Вот базовая реализация демонстрационного приложения:
public class ContactsCompletionView extends TokenCompleteTextView {
public ContactsCompletionView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected View getViewForObject(Object object) {
Person p = (Person)object;
LayoutInflater l = (LayoutInflater)getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
LinearLayout view = (LinearLayout)l.inflate(R.layout.contact_token, (ViewGroup)ContactsCompletionView.this.getParent(), false);
((TextView)view.findViewById(R.id.name)).setText(p.getEmail());
return view;
}
@Override
protected Object defaultObject(String completionText) {
//Stupid simple example of guessing if we have an email or not
int index = completionText.indexOf('@');
if (index == -1) {
return new Person(completionText, completionText.replace(" ", "") + "@example.com");
} else {
return new Person(completionText.substring(0, index), completionText);
}
}
}
Код макета для contact_token (здесь вы можете использовать любой вид макета или можете вставлять ImageView, если вы хотите, чтобы изображения в токене)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
<TextView android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/token_background"
android:padding="5dp"
android:textColor="@android:color/white"
android:textSize="18sp" />
</LinearLayout>
Отверстие для возврата к токену
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="#ffafafaf" />
<corners
android:topLeftRadius="5dp"
android:bottomLeftRadius="5dp"
android:topRightRadius="5dp"
android:bottomRightRadius="5dp" />
</shape>
Объектный код Person
public class Person implements Serializable {
private String name;
private String email;
public Person(String n, String e) { name = n; email = e; }
public String getName() { return name; }
public String getEmail() { return email; }
@Override
public String toString() { return name; }
}
Пример активности
public class TokenActivity extends Activity {
ContactsCompletionView completionView;
Person[] people;
ArrayAdapter<Person> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
people = new Person[]{
new Person("Marshall Weir", "[email protected]"),
new Person("Margaret Smith", "[email protected]"),
new Person("Max Jordan", "[email protected]"),
new Person("Meg Peterson", "[email protected]"),
new Person("Amanda Johnson", "[email protected]"),
new Person("Terry Anderson", "[email protected]")
};
adapter = new ArrayAdapter<Person>(this, android.R.layout.simple_list_item_1, people);
completionView = (ContactsCompletionView)findViewById(R.id.searchView);
completionView.setAdapter(adapter);
}
}
Формат макета
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.tokenautocomplete.ContactsCompletionView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
Ответ 3
Вы можете сделать это, создав подкласс android.text.style.DynamicDrawableSpan
. ImageSpan
является примером этого: он заменяет диапазон (диапазон) текста изображением.
В этом примере будет помещена звездочка в поле редактирования, заменив текст "test". Создайте EditText в своем макете с идентификатором "text" и поместите его в onCreate()
(или где угодно):
EditText mText = (EditText) findViewById(R.id.text);
final Editable e = mText.getEditableText();
final SpannableStringBuilder sb = new SpannableStringBuilder();
sb.append("test");
sb.setSpan(new ImageSpan(this, android.R.drawable.btn_star), 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
e.append(sb);
Я не видел классов, которые выглядели так, как будто они могли обернуть нормальный текст в drawable, но это довольно легко решить, переопределив метод getDrawable()
и сделав сам текст.
Ответ 4
Я решил это ЗДЕСЬ Связаться с Bubble EditText
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 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);
}
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;
}
Ответ 5
Если вы имеете в виду подсказки, вы можете добавить просто:
android:hint="@string/myHint"
Это приведет к пометке серой метки в EditText, когда она пуста.
Ответ 6
Чтобы установить значок круга в левой части EditText
, вы можете изменить leftDrawable
.
Вы можете сделать это в XML файле макета android:drawableRight="@drawable/search_icon"
или программно с помощью функции setCompoundDrawablesWithIntrinsicBounds
.
Если вы также хотите создать стиль пузыря, вы должны изменить обратную линию, которую можно вырезать с помощью 9-patch, которые имеют стиль. здесь у вас есть учебник для 9-патч-пузыря для карт Google.
Надеюсь, это помогло!:)
Ответ 7
Я думаю, что он использует метод setCompoundDrawables() для вставки этого изображения внутри текста редактирования
Ответ 8
Я решил что-то вернуть сообществу и создал библиотеку, которая направлена на решение этой точной проблемы. Библиотека вместе с примером проекта доступна для GitHub: https://github.com/RafalManka/BubbleEditText