如何在用户在 android studio 中按 space/comma 后对每个单词进行框选?

How to box each word after user presses space/comma in android studio?

我目前正在尝试制作 android 应用程序,但 运行 遇到了问题。您将如何允许用户键入一个单词,一旦他们按下 space/comma,它会将单词框起来,最好带有退出选项。

https://i.stack.imgur.com/BwpZ9.png

https://i.stack.imgur.com/zqOLo.png

任何符合这些图片的东西都是完美的。

您想要的在 Android 中称为 chips,它是您可以阅读其规范的原生设计之一 here .
Here are a few example to get you started, last time I checked there was no proper documentation or support for this feature so I ended up using one the libraries that has built it, you can do something yourself by implementing a custom view as explained

下面是我将如何实现它。这是一个工作示例。当用户点击 space 它添加和项目。当您单击一个项目时,它将被删除。

这是它的动图。 https://giphy.com/gifs/l4EpayEaAuGV58tgY

添加到 gradle:

compile 'com.android.support:design:26.0.0-alpha1'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
compile 'com.xiaofeng.android:flowlayoutmanager:1.2.3.2'

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler);
        recyclerView.setLayoutManager(new FlowLayoutManager());
        recyclerView.setAdapter(new CustomRecyclerAdapter());
    }
}

public class CustomRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private static final int HOLDER_ERROR = 0;
    private static final int HOLDER_BOX = 1;
    private static final int HOLDER_EDIT = 2;
    private List<Object> objectList = new ArrayList<>();

    public CustomRecyclerAdapter() {
        objectList.add(0);
    }

    public void addItem(String item) {
        objectList.add(getItemCount() - 1, item);
        notifyItemInserted(getItemCount() - 1);

    }

    public void removeItem(int position) {
        objectList.remove(position);
        notifyItemRemoved(position);
    }

    @Override
    public int getItemCount() {
        return objectList.size();
    }

    @Override
    public int getItemViewType(int position) {
        if (objectList.get(position) instanceof String) {
            return HOLDER_BOX;
        } else if (objectList.get(position) instanceof Integer) {
            return HOLDER_EDIT;
        } else {
            return HOLDER_ERROR;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case HOLDER_ERROR:
                return null;
            case HOLDER_BOX:
                return new ViewHolderBox(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_box, parent, false));
            case HOLDER_EDIT:
                return new ViewHolderEdit(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_edit_text, parent, false));
            default:
                return null;
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ViewHolderBox) {
            ViewHolderBox mHolder = (ViewHolderBox) holder;
            mHolder.bindItems();
        } else if (holder instanceof ViewHolderEdit) {
            ViewHolderEdit mHolder = (ViewHolderEdit) holder;
            mHolder.bindItems();
        }
        holder.itemView.setTag(this);
    }

    private class ViewHolderEdit extends RecyclerView.ViewHolder implements TextWatcher {
        private EditText edit;

        private ViewHolderEdit(View itemView) {
            super(itemView);
            edit = itemView.findViewById(R.id.edit);
            InputMethodManager imm = (InputMethodManager) itemView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInputFromInputMethod(edit.getWindowToken(), 0);
        }

        private void bindItems() {
            edit.addTextChangedListener(this);
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            String editString = edit.getText().toString();
            Pattern pattern = Pattern.compile("\s");
            Matcher matcher = pattern.matcher(editString);
            if (matcher.find()) {
                if (!editString.trim().equalsIgnoreCase("")) {
                    addItem(editString.trim());
                    edit.setText("");
                    edit.requestFocus();
                }
            }
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }


        @Override
        public void afterTextChanged(Editable editable) {

        }
    }

    private class ViewHolderBox extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView text;

        private ViewHolderBox(View itemView) {
            super(itemView);
            text = itemView.findViewById(R.id.text);
            text.setOnClickListener(this);
        }

        private void bindItems() {
            String item = (String) objectList.get(getAdapterPosition());
            text.setText(item);
        }

        @Override
        public void onClick(View view) {
            removeItem(getAdapterPosition());
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/recycler"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="resume.eugene.com.testing.MainActivity" />

recycler_box.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="34dp"
        android:layout_marginBottom="2dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="2dp"
        android:background="#90CAF9"
        android:clickable="true"
        android:gravity="center"
        android:paddingLeft="12dp"
        android:paddingRight="12dp"
        android:text="Testing" />
</LinearLayout>

recycler_edit_text.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/edit"
        android:layout_width="wrap_content"
        android:layout_height="34dp"
        android:layout_marginBottom="2dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginTop="2dp"
        android:background="@android:color/transparent"
        android:gravity="center_vertical"
        android:hint="Add Item"
        android:minWidth="50dp"
        android:textSize="15sp" />
</LinearLayout>