【问题标题】:Possible to autocomplete a EditTextPreference?可以自动完成 EditTextPreference 吗?
【发布时间】:2011-03-20 13:43:45
【问题描述】:

是否可以附加一个带有 AutoComplete 的 EditTextPreference?

我知道如何将一个附加到具有 id 的元素,但我无法弄清楚如何将 ArrayAdapter 附加到首选项字段。

这是错误的,但我已经尽可能接近了。

final String[] TEAMS = getResources().getStringArray(R.array.teams);   
AutoCompleteTextView EditTextPreference = (AutoCompleteTextView) findViewById(R.id.editTextPrefTeam);     
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, TEAMS);
EditTextPreference.setAdapter(adapter);

【问题讨论】:

    标签: android autocomplete android-edittext


    【解决方案1】:

    如果您将其子类化并为此创建自己的视图并使用 AutoCompleteTextView 对象作为元素,它可能会起作用,因为目前我看不到如何将简单的 EditText 更改为自动完成。

    【讨论】:

      【解决方案2】:

      这是我通过研究EditTextPreference.java 源代码实现的解决方法。

      基本上你需要继承 EditTextPreference 并在它绑定到对话框时覆盖它。此时,您可以检索 EditText,复制它的值,并将其从其父视图组中删除。然后你注入你的 Autocompletetextview 并连接它的 Arrayadapter。

      public class AutoCompleteEditTextPreference extends EditTextPreference
      {
          public AutoCompleteEditTextPreference(Context context)
          {
              super(context);
          }
      
          public AutoCompleteEditTextPreference(Context context, AttributeSet attrs)
          {
              super(context, attrs);
          }
      
          public AutoCompleteEditTextPreference(Context context, AttributeSet attrs,
              int defStyle)
          {
              super(context, attrs, defStyle);
          }       
      
          /**
           * the default EditTextPreference does not make it easy to
           * use an AutoCompleteEditTextPreference field. By overriding this method
           * we perform surgery on it to use the type of edit field that
           * we want.
           */
          protected void onBindDialogView(View view)
          {
              super.onBindDialogView(view);
      
              // find the current EditText object
              final EditText editText = (EditText)view.findViewById(android.R.id.edit);
              // copy its layout params
              LayoutParams params = editText.getLayoutParams();
              ViewGroup vg = (ViewGroup)editText.getParent();
              String curVal = editText.getText().toString();
              // remove it from the existing layout hierarchy
              vg.removeView(editText);        
              // construct a new editable autocomplete object with the appropriate params
              // and id that the TextEditPreference is expecting
              mACTV = new AutoCompleteTextView(getContext());
              mACTV.setLayoutParams(params);
              mACTV.setId(android.R.id.edit);
              mACTV.setText(curVal);
      
      
              ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), 
                   android.R.layout.simple_dropdown_item_1line, [LIST OF DATA HERE]);
              mACTV.setAdapter(adapter);
      
              // add the new view to the layout
              vg.addView(mACTV);
          }
      
          /**
           * Because the baseclass does not handle this correctly
           * we need to query our injected AutoCompleteTextView for
           * the value to save 
           */
          protected void onDialogClosed(boolean positiveResult) 
          {
              super.onDialogClosed(positiveResult);
      
              if (positiveResult && mACTV != null) 
              {           
                  String value = mACTV.getText().toString();
                  if (callChangeListener(value)) {
                      setText(value);
                  }
              }
          }
      
          /**
           * again we need to override methods from the base class
           */
          public EditText getEditText() 
          {
              return mACTV;
          }
      
          private AutoCompleteTextView mACTV = null;
          private final String TAG = "AutoCompleteEditTextPreference";
      }
      

      【讨论】:

        【解决方案3】:

        在我看来,必须有一种“更简单”的方法来完成此操作,而不是侵入 EditTextPreference 类并弄乱视图。这是我的解决方案,因为 AutoCompleteTextView 扩展了 EditText,我只需要重写直接调用其常量 EditText 对象的 EditTextPreference 方法。

        public class AutoCompletePreference extends EditTextPreference {
        
        private static AutoCompleteTextView mEditText = null;
        
        public AutoCompletePreference(Context context, AttributeSet attrs) {
            super(context, attrs);
            mEditText = new AutoCompleteTextView(context, attrs);
            mEditText.setThreshold(0);
            //The adapter of your choice
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_dropdown_item_1line, COUNTRIES);
            mEditText.setAdapter(adapter);
        }
        private static final String[] COUNTRIES = new String[] {
            "Belgium", "France", "Italy", "Germany", "Spain"
        };
        
        @Override
        protected void onBindDialogView(View view) {
            AutoCompleteTextView editText = mEditText;
            editText.setText(getText());
        
            ViewParent oldParent = editText.getParent();
            if (oldParent != view) {
                if (oldParent != null) {
                    ((ViewGroup) oldParent).removeView(editText);
                }
                onAddEditTextToDialogView(view, editText);
            }
        }
        
        @Override
        protected void onDialogClosed(boolean positiveResult) {
            if (positiveResult) {
                String value = mEditText.getText().toString();
                if (callChangeListener(value)) {
                    setText(value);
                }
            }
        }
        }
        

        感谢 Brady 链接到源代码。

        【讨论】:

        • 几乎!我的自动完成框出现了,但自动完成下拉框被切断并显示在输入字段上方,下拉列表的下半部分未显示。
        • 实际上,我可以通过硬编码下拉框高度的值来修复我之前评论中的错误。
        猜你喜欢
        • 2010-10-14
        • 2013-02-21
        • 2014-12-16
        • 1970-01-01
        • 2020-05-03
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多