如何使用Android Studio实现自动建议UI?

时间:2017-07-17 00:32:16

标签: java android autocompletetextview tagging

我正在写照片应用。用户可以点击某人的照片并对其进行标记。我想按如下方式实现标记:

  • 1)用户查看照片并识别John Smith。
  • 2)用户点击文本输入字段。
  • 3)用户开始输入' Jo ...'
  • 4)建议的Gmail帐户列表供用户选择(例如johny123 @ gmail.com,johnsmith @ gmail.com,joanna @ gmail.com)。
  • 5)用户点击列表中的正确帐户(johnsmith@gmail.com)。
  • 6)照片上标有用户选择的帐户。

我已经实施了许多部分,除了第4部分。下面我介绍当前用户界面的代码:

// This method is invoked after the user finishes typing and clicks enter.
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
    // other code
    ...

    String usersEntry = textView.getText().toString();
    tagPhotoWith(usersLabel);
    return true;
}

目前,用户点击输入后用户输入的任何文字都会成为照片标记。相反,我希望应用程序显示建议的gmail.com帐户列表,以便用户可以选择适当的帐户进行标记。 怎么做?

2 个答案:

答案 0 :(得分:2)

您必须使用AutoCompleteTextView来获取已保存字符串的建议(在您的情况下,它们是电子邮件ID,无论是从数据库获取还是在某个时间在程序中预先定义)。

这里,只要用户输入字符串的2或3个字符,就会在AutoCompleteTextView上设置一个适配器,以便为输入框设置字符串数组/ Arraylist。

AutoCompleteTextView textProductView;
textProductView = (AutoCompleteTextView) findViewById(R.id.txtItem);

ArrayAdapter<String> etAdapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ITEMS);
textProductView.setAdapter(etAdapter);

此处,ITEMS是一个字符串数组,根据从用户/数据库获取的数据或在活动中预定义的数据定义。

答案 1 :(得分:2)

如果要显示具有良好GUI的自动完成,您可以选择弹出窗口,也可以使用自定义列表视图或recyclerview,并在您的activty和xml中使用setvisibility Gone / Visible。

我已经为我的应用程序使用Listview视图准备了自定义自动搜索,如下所示。

//activity_main.xml
<LinearLayout 
 //  parent layout
     android:orientation="vertical"
>
     < ....      /* your code for toolbar */          ..../>
     <Edittext 
       android:id="@+id/edittext"
       /*  your customization*/
      />
      <Relativelayou
      android:height="match_parent"
      android:width=""match_parent"
      >
          <LinearLayout > /*your main xml code*/ </LinearLayout>
          <ListView
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:id="@+id/lstvw"
           android:dividerHeight="0dp"
           android:visibility="gone">

         </ListView>

      </RelativeLayout>

在MainActivity中使用EditText.addTextChangedListener。

//MainActivity.java
   EditText ed;
   ListView lst;
   ArrayList<String> array=new ArrayList<>();
   ArrayList<String> array1=new ArrayList<>();

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

    ed= (EditText) findViewById(R.id.edtxt);
    lst= (ListView) findViewById(R.id.lstvw);
    lst.setVisibility(View.GONE);

    ed.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int  ount, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            String str=ed.getText().toString();
            array1.clear();
            lst.setVisibility(View.VISIBLE);
            for(int i=0;i<array.size();i++)
            {
                if(array.get(i).toLowerCase().startsWith(str.toLowerCase()))
                {
                    array1.add(array.get(i));
                }
            }
            if((ArrayAdapter<String> )lst.getAdapter()!=null){
            ((ArrayAdapter<String> )lst.getAdapter()).notifyDataSetChanged();}
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
    lst.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            lst.setVisibility(View.GONE);
        }
    });

    ArrayAdapter<String> ad=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,array1);
    ad.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
    lst.setAdapter(ad);

}}

您可以根据自己的设计使用自定义列表视图行。

希望这会对你有帮助!!!