Android AutoCompleteTextView with chips

后端 未结 7 1027
挽巷
挽巷 2020-12-02 15:42

I am not sure I am using the right words for this UI feature, but I have attached a snapshot of what I am looking to achieve in my app.

Its used by Go SMS, where a u

相关标签:
7条回答
  • 2020-12-02 16:18

    The official Chips library from Google (as used in Gmail, Email, Calendar, Messaging) is located at https://android.googlesource.com/platform/frameworks/opt/chips/

    A simple example of how to use it can be found at https://code.google.com/p/platform-features-talk-io-2013/source/browse/src/com/example/iotalk/ChipsActivity.java

    0 讨论(0)
  • 2020-12-02 16:21

    there is a new library for Android Material Chips!

    0 讨论(0)
  • 2020-12-02 16:24

    I think we can build our own chips view with Recycler view and Edit text or Auto complete text view. So we can customize it easily.

    1. Created a tag shape say, tags_layout.xml in 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. Created a layout for recycler view

    <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. In our activity layout, we implement widgets recycler view just above edit text to keeping tags and edit text or Autocomplete text view to enter tags.

       <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. Created a model java class for recycler view

            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. Adapter class for recycler view

        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. Finally, In our activity, add data to recycler on entering data in edit text

    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. Manifest file should contain gradles

    implementation 'com.android.support:recyclerview-v7:27.1.1'
    implementation 'com.google.android:flexbox:1.0.0'
    
    0 讨论(0)
  • 2020-12-02 16:24

    A lot has changed. we have new libraries. I would recommend this library. It is very easy and powerful.

    Simply add this dependency

    implementation "com.hootsuite.android:nachos:1.1.1"
    

    and this view

    <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"/>
    

    and this adapter:

    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)
    
    0 讨论(0)
  • 2020-12-02 16:25

    Starting from android support library version 28.0.0 Google added Chip view that allows us to display a chip view within our layout. Design and documentation about Chip

    And simple example:

    <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>
    

    0 讨论(0)
  • 2020-12-02 16:33

    Two more Chips libraries.

    • Android Chips. Unlike some other this one is updated to have visuals reflecting the newly released "Material Design" standard.

      enter image description here

    • Token Auto Complete. It is an Android Gmail style token auto-complete text field and filter.

      enter image description here
      enter image description here

    0 讨论(0)
提交回复
热议问题