【问题标题】:Custom AutoCompletevView like facebook comments field in android自定义 AutoCompletevView,如 android 中的 facebook 评论字段
【发布时间】:2015-08-05 01:40:02
【问题描述】:

我想像这样制作自定义 AutoCompleteView..

添加我的特殊字符时应该填充它(例如 facebook.. 当您键入 @B 时,所有名称以“B”开头的朋友都将被填充,我们可以选择名称)。

在添加“@”之前,不应在键入时填充它。

当添加'@'时,自动完成视图被下拉,我们可以选择名称,选择后将被追加。

我找到了this,但不满意。我需要线索。他们已经实现了......就像你输入'@'下拉填充时一样。但我必须自定义更多。现在,如果其他人有想法或任何未完成的来源,我需要帮助。

我必须自己尝试,但在实施 customview 之前让我问一下以节省我的时间。

【问题讨论】:

    标签: android autocomplete android-custom-view autocompletetextview


    【解决方案1】:

    您必须通过扩展类来制作自定义自动完成视图......并且您的问题中提到的代码将被更改。

    public class CustomAutoComplete extends AutoCompleteTextView {
    private String previous = "";
    private String seperator = "@";
    boolean isState = false;
    
    public CustomAutoComplete(final Context context, final AttributeSet attrs,
            final int defStyle) {
        super(context, attrs, defStyle);
        this.setThreshold(1);
    
    }
    
    public CustomAutoComplete(final Context context, final AttributeSet attrs) {
        super(context, attrs);
        this.setThreshold(1);
    }
    
    public CustomAutoComplete(final Context context) {
        super(context);
        this.setThreshold(1);
    }
    
    /**
     * This method filters out the existing text till the separator and launched
     * the filtering process again
     */
    @Override
    protected void performFiltering(final CharSequence text, final int keyCode) {
        String filterText = text.toString().trim();
        String lastchar = filterText.substring(filterText.length() - 1,
                filterText.length());
        if (filterText.length() == 1) {
            if (lastchar.equals(seperator)) {
                isState = true;
            } else {
                isState = false;
            }
        }
        previous = filterText.substring(0,
                filterText.lastIndexOf(getSeperator()) + 1);
    
        filterText = filterText.substring(filterText
                .lastIndexOf(getSeperator()) + 1);
    
        if ((lastchar.equals(seperator)) || isState) {
            super.performFiltering(filterText, keyCode);
    
            isState = true;
    
        }
    }
    
    /**
     * After a selection, capture the new value and append to the existing text
     */
    @Override
    protected void replaceText(final CharSequence text) {
        isState = false;
        super.replaceText(previous + text);// + getSeperator());
    
    }
    
    public String getSeperator() {
        return seperator;
    }
    
    public void setSeperator(final String seperator) {
        this.seperator = seperator;
    }
    
    }
    

    希望对你有所帮助...

    【讨论】:

      【解决方案2】:

      您可以使用MultiAutoCompleteTextView 实现此目的。只需实现您自己的 Tokenizer 类即可。对于提及我已经写了一个类,你可以使用它。

      package howdysam.com.howdysuggesttext;
      
      import android.text.SpannableString;
      import android.text.Spanned;
      import android.text.TextUtils;
      import android.widget.MultiAutoCompleteTextView;
      
      
      public class AtTokenizer implements MultiAutoCompleteTextView.Tokenizer {
      
          @Override
          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;
          }
      
          @Override
          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;
          }
      
          @Override
          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;
                  }
              }
          }
      }
      

      然后在视图部分(活动或片段)而不是做

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

      关注

      edit.setTokenizer(new AtTokenizer());
      

      有效。

      【讨论】:

        猜你喜欢
        • 2011-10-27
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        • 1970-01-01
        • 2019-01-28
        • 1970-01-01
        相关资源
        最近更新 更多