7

是否可以附加一个带有 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);
4

3 回答 3

8

在我看来,必须有一种“更简单”的方法来完成此操作,而不是侵入 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);
        }
    }
}
}

感谢布雷迪链接到源。

于 2011-05-23T02:40:29.990 回答
8

这是我通过研究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";
}
于 2010-11-29T23:36:55.707 回答
0

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

于 2010-07-27T14:12:47.197 回答