Android AutoCompleteTextView с чипами
Я не уверен, что использую правильные слова для этой функции пользовательского интерфейса, но я добавил моментальный снимок того, что я ищу для достижения в своем приложении.
Используется в SMS-сообщении Go, где пользователь набирает контакты в текстовом редакторе после того, как пользователь выбирает контакт из раскрывающегося списка завершения, контакт вставляется в текст редактирования как показано в прикрепленном изображении. Текст редактирования все еще открыты для принятия дальнейшего ввода.
Для моего приложения я хотел бы выполнить группировку и вставку, как только пользователь вводит запятую. Как и тег ввода для StackOverflow (но я считаю, что я могу справиться с этим в одиночку.) Моя проблема в том, View это или как мне изменить EditText, чтобы вести себя следующим образом?
![EditText with Grouped Values]()
Спасибо.
Ответы
Ответ 1
Официальная библиотека Chips из Google (используемая в Gmail, Email, Calendar, Messaging) находится в https://android.googlesource.com/platform/frameworks/opt/chips/
Простой пример того, как его использовать, можно найти в https://code.google.com/p/platform-features-talk-io-2013/source/browse/src/com/example/iotalk/ChipsActivity.java
Ответ 2
Еще две библиотеки микросхем.
-
Android-чипы. В отличие от некоторых других, этот обновляется, чтобы иметь визуальные эффекты, отражающие недавно выпущенный стандарт "Material Design" .
![enter image description here]()
-
Автозагрузка Token Auto. Это текстовое поле для автозаполнения стиля Android Gmail и фильтр.
![enter image description here]()
![enter image description here]()
Ответ 3
Обновление:
Официальный способ сделать это теперь через материальную составляющую Chips.
https://material.io/components/chips/
https://material.io/develop/android/components/chip/
https://medium.com/material-design-in-action/chips-material-components-for-android-46001664a40f
Старый ответ:
Вы ищете библиотеку Chips.
Ответ 4
есть новая библиотека для чипов материалов Android!
Ответ 5
Я думаю, что мы можем создать наш собственный вид фишек с видом Recycler и Edit text или Auto complete text view. Таким образом, мы можем легко настроить его.
1. Создайте форму тега скажем, tags_layout.xml в Drawable
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#cfcfcf">
</solid>
<corners android:radius="20dp">
</corners>
2. Создан макет для вида переработчика
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_margin="4dp"
android:gravity="center"
android:background="@drawable/tags_layout">
<TextView
android:id="@+id/tag_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:maxLength="25"
android:ellipsize="end"
android:padding="2dp"
android:text="Hello"/>
<ImageView
android:id="@+id/tag_closeBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_close"/>
3. В нашем макете действий мы реализуем вид утилизатора виджетов, расположенный над редактируемым текстом для сохранения тегов и редактирования текста, или автозаполнение текстового представления для ввода тегов.
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/tagsRecyclerView"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
<EditText
android:id="@+id/tagsEditText"
android:inputType="text"
android:imeOptions="actionDone"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
4. Создан модельный Java-класс для представления переработчика
public class RecyclerModel {
private String tagText;
public RecyclerModel(String tagText){
this.tagText = tagText;
}
public String getTagText() {
return tagText;
}
public void setTagText(String tagText) {
this.tagText = tagText;
}
}
5. Класс адаптера для вида переработчика
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerAdapterHolder> {
Context context;
ArrayList<RecyclerModel> model = new ArrayList<>( );
public RecyclerAdapter(Context context,ArrayList<RecyclerModel> model){
this.context = context;
this.model = model;
}
@NonNull
@Override
public RecyclerAdapterHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_layout, parent, false);
return new RecyclerAdapterHolder(itemView);
}
@Override
public void onBindViewHolder(final RecyclerAdapterHolder holder, final int position) {
final RecyclerModel mod = model.get( position );
holder.tagTextView.setText( mod.getTagText() );
//remove tag on click x button
holder.tagImageView.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
model.remove( position );
notifyDataSetChanged();
}
} );
}
@Override
public int getItemCount() {
return model.size();
}
public static class RecyclerAdapterHolder extends RecyclerView.ViewHolder {
public TextView tagTextView;
public ImageView tagImageView;
public RecyclerAdapterHolder(View itemView) {
super( itemView );
tagTextView = itemView.findViewById( R.id.tag_textView );
tagImageView = itemView.findViewById( R.id.tag_closeBtn );
}
}
}
6. Наконец, в нашей деятельности добавьте данные в утилизационный центр при вводе данных в тексте для редактирования
public class MainActivity extends AppCompatActivity {
RecyclerView tagsRecyclerView;
EditText tagsEditText;
ArrayList<RecyclerModel> recyclerModels = new ArrayList<>( );
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
tagsRecyclerView = findViewById( R.id.tagsRecyclerView );
tagsEditText = findViewById( R.id.tagsEditText );
tagsEditText.setOnEditorActionListener( new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
Toast.makeText( MainActivity.this,"hello",Toast.LENGTH_SHORT );
String str = tagsEditText.getText().toString();
if(str != null && !str.equals( "" )) {
getUpdateData( str );
tagsEditText.setText( null );
RecyclerAdapter adapter = new RecyclerAdapter( MainActivity.this, recyclerModels );
FlexboxLayoutManager gridLayout = new FlexboxLayoutManager( MainActivity.this );
tagsRecyclerView.setLayoutManager( gridLayout );
tagsRecyclerView.setAdapter( adapter );
}
}
return false;
}
} );
}
private void getUpdateData(String str) {
RecyclerModel model = new RecyclerModel( str );
recyclerModels.add( model );
}
}
7. Файл манифеста должен содержать градиенты
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.google.android:flexbox:1.0.0'
Ответ 6
Начиная с версии библиотеки поддержки Android 28.0.0 Google добавил представление Chip
, которое позволяет нам отображать представление чипа в нашем макете.
Дизайн и документация о чипе
И простой пример:
<android.support.design.chip.ChipGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
app:chipSpacing="8dp">
<android.support.design.chip.Chip
android:id="@+id/some_chip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android Chip Group"
app:chipIcon="@drawable/ic_android"
app:closeIconVisible="true" />
<android.support.design.chip.Chip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android"
app:chipIcon="@drawable/ic_android" />
<android.support.design.chip.Chip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Chip"
app:chipIcon="@drawable/ic_android" />
<android.support.design.chip.Chip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Group"
app:chipIcon="@drawable/ic_android" />
</android.support.design.chip.ChipGroup>
![enter image description here]()
Ответ 7
Многое изменилось. у нас есть новые библиотеки. Я бы порекомендовал эту библиотеку. Это очень легко и мощно.
Просто добавьте эту зависимость
implementation "com.hootsuite.android:nachos:1.1.1"
и этот вид
<com.hootsuite.nachos.NachoTextView
android:id="@+id/nacho_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:chipHorizontalSpacing="2dp"
app:chipBackground="@color/chip_background"
app:chipTextColor="@color/cheddar"
app:chipTextSize="16dp"
app:chipHeight="30dp"
app:chipVerticalSpacing="3dp"/>
и этот адаптер:
val suggestions = arrayOf("Tortilla Chips", "Melted Cheese", "Salsa", "Guacamole", "Mexico", "Jalapeno")
val adapter = ArrayAdapter(context, android.R.layout.simple_dropdown_item_1line, suggestions)
nachoTextView.setAdapter(adapter)