Android MultiAutocompleteTextView

时间:2020-02-23 14:29:04  来源:igfitidea点击:

在本教程中,我们将在应用程序中讨论和实现MultiAutocompleteTextView小部件。

Android MultiAutoCompleteTextView

MultiAutoCompleteTextView扩展了AutoCompleteTextView。
与仅显示一个字符串的建议的AutoCompleteTextView不同,MultiAutoCompleteTextView会为您输入的每个子字符串(由标记分隔)显示建议。

在指定多个标签(在StackOverflow或者Github上遇到过这种标签)之类的地方,此功能相当普遍。
在向多个人发送消息时,您也必须使用过该功能。

AutoCompleteTextView仅提供有关整个文本的建议。

如何实施?

在MultiAutoCompleteTextView实例上设置了Tokenizer实例。
在Android中,默认情况下,我们有一个CommaTokenizer内置类,以逗号分隔自动完成字符串。
从下拉列表中选择一个字符串后,将在逗号后附加该子字符串的结尾。

令牌生成器在方法setTokenizer()中设置。

另一个重要方法:setThreshold()用于指定字符数,之后将显示带有自动完成建议列表的下拉列表。

代码

下面给出了activity_main.xml类的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
  xmlns:tools="https://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_gravity="center"
  android:layout_margin="16dp"
  android:orientation="vertical"
  tools:context=".MainActivity">

  <TextView
      android:id="@+id/textView"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:gravity="center"
      android:text="Separated by Commas"
      android:textSize="18sp" 

  <MultiAutoCompleteTextView
      android:id="@+id/multiAutoCompleteTextView"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_margin="20dp"
      android:ems="10"
      android:hint="Enter here" 

  <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:gravity="center"
      android:text="Separated by Custom Token"
      android:textSize="18sp" 

  <MultiAutoCompleteTextView
      android:id="@+id/multiAutoCompleteTextViewCustom"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_margin="20dp"
      android:ems="10"
      android:hint="Add tags here" 

</LinearLayout>

第一个MultiAutoCompleteTextView可以使用逗号标记器。
第二个将使用自定义的-空间标记器。

下面给出了SpaceTokenizer.java的代码:

package com.theitroad.androidmultiautocompletetextview;

import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.widget.MultiAutoCompleteTextView;

public class SpaceTokenizer implements MultiAutoCompleteTextView.Tokenizer {

  public int findTokenStart(CharSequence text, int cursor) {
      int i = cursor;

      while (i > 0 && text.charAt(i - 1) != ' ') {
          i--;
      }
      while (i < cursor && text.charAt(i) == ' ') {
          i++;
      }

      return i;
  }

  public int findTokenEnd(CharSequence text, int cursor) {
      int i = cursor;
      int len = text.length();

      while (i < len) {
          if (text.charAt(i) == ' ') {
              return i;
          } else {
              i++;
          }
      }

      return len;
  }

  public CharSequence terminateToken(CharSequence text) {
      int i = text.length();

      while (i > 0 && text.charAt(i - 1) == ' ') {
          i--;
      }

      if (i > 0 && text.charAt(i - 1) == ' ') {
          return text;
      } else {
          if (text instanceof Spanned) {
              SpannableString sp = new SpannableString(text + " ");
              TextUtils.copySpansFrom((Spanned) text, 0, text.length(),
                      Object.class, sp, 0);
              return sp;
          } else {
              return text + " ";
          }
      }
  }
}

方法findTokenStart,findTokenEnd和terminateToken是Tokenizer接口的一部分并已实现。

下面给出了MainActivity.java类的代码

package com.theitroad.androidmultiautocompletetextview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.MultiAutoCompleteTextView;

public class MainActivity extends AppCompatActivity {

  MultiAutoCompleteTextView multiAutoCompleteTextView, multiAutoCompleteTextViewCustom;

  String[] randomSuggestions = {"a", "aa", "ab", "aab", "abc", "abcd", "abcde", "abcdef"};
  String[] tags = {"Java", "JavaScript", "Spring", "Java EE", "Java 8", "Java 9", "Java 10", "SQL", "SQLite"};

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      multiAutoCompleteTextView = findViewById(R.id.multiAutoCompleteTextView);
      multiAutoCompleteTextViewCustom = findViewById(R.id.multiAutoCompleteTextViewCustom);

      ArrayAdapter<String> randomArray = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, randomSuggestions);
      multiAutoCompleteTextView.setAdapter(randomArray);
      multiAutoCompleteTextView.setThreshold(1);

      multiAutoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());

      ArrayAdapter<String> tagArray = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, tags);
      multiAutoCompleteTextViewCustom.setAdapter(tagArray);
      multiAutoCompleteTextViewCustom.setThreshold(2);

      multiAutoCompleteTextViewCustom.setTokenizer(new SpaceTokenizer());

  }
}